<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Interactive BOM for KiCAD</title>
  <style type="text/css">
:root {
  --pcb-edge-color: black;
  --pad-color: #878787;
  --pad-color-highlight: #D04040;
  --pin1-outline-color: #ffb629;
  --pin1-outline-color-highlight: #b4ff03;
  --silkscreen-edge-color: #aa4;
  --silkscreen-polygon-color: #4aa;
  --silkscreen-text-color: #4aa;
  --fabrication-edge-color: #907651;
  --fabrication-polygon-color: #907651;
  --fabrication-text-color: #a27c24;
  --track-color: #def5f1;
  --track-color-highlight: #D04040;
  --zone-color: #def5f1;
  --zone-color-highlight: #d0404080;
}

html, body {
  margin: 0px;
  height: 100%;
  font-family: Verdana, sans-serif;
}

.dark.topmostdiv {
  --pcb-edge-color: #eee;
  --pad-color: #808080;
  --pin1-outline-color: #ffa800;
  --pin1-outline-color-highlight: #ccff00;
  --track-color: #42524f;
  --zone-color: #42524f;
  background-color: #252c30;
  color: #eee;
}

button {
  background-color: #eee;
  border: 1px solid #888;
  color: black;
  height: 44px;
  width: 44px;
  text-align: center;
  text-decoration: none;
  display: inline-block;
  font-size: 14px;
  font-weight: bolder;
}

.dark button {
  /* This will be inverted */
  background-color: #c3b7b5;
}

button.depressed {
  background-color: #0a0;
  color: white;
}

.dark button.depressed {
  /* This will be inverted */
  background-color: #b3b;
}

button:focus {
  outline: 0;
}

button#tb-btn {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' fill='none' stroke='%23000' stroke-width='.4' stroke-linejoin='round'/%3E%3Cpath d='M1.32 290.12h5.82M1.32 291.45h5.82' fill='none' stroke='%23000' stroke-width='.4'/%3E%3Cpath d='M4.37 292.5v4.23M.26 292.63H8.2' fill='none' stroke='%23000' stroke-width='.3'/%3E%3Ctext font-weight='700' font-size='3.17' font-family='sans-serif'%3E%3Ctspan x='1.35' y='295.73'%3EF%3C/tspan%3E%3Ctspan x='5.03' y='295.68'%3EB%3C/tspan%3E%3C/text%3E%3C/g%3E%3C/svg%3E%0A");
  background-size: 32px 32px;
  background-position: 5px 5px;
  background-repeat: no-repeat;
}

button#lr-btn {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' fill='none' stroke='%23000' stroke-width='.4' stroke-linejoin='round'/%3E%3Cpath d='M1.06 290.12H3.7m-2.64 1.33H3.7m-2.64 1.32H3.7m-2.64 1.3H3.7m-2.64 1.33H3.7' fill='none' stroke='%23000' stroke-width='.4'/%3E%3Cpath d='M4.37 288.8v7.94m0-4.11h3.96' fill='none' stroke='%23000' stroke-width='.3'/%3E%3Ctext font-weight='700' font-size='3.17' font-family='sans-serif'%3E%3Ctspan x='5.11' y='291.96'%3EF%3C/tspan%3E%3Ctspan x='5.03' y='295.68'%3EB%3C/tspan%3E%3C/text%3E%3C/g%3E%3C/svg%3E%0A");
  background-size: 32px 32px;
  background-position: 5px 5px;
  background-repeat: no-repeat;
}

button#bom-btn {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)' fill='none' stroke='%23000' stroke-width='.4'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' stroke-linejoin='round'/%3E%3Cpath d='M1.59 290.12h5.29M1.59 291.45h5.33M1.59 292.75h5.33M1.59 294.09h5.33M1.59 295.41h5.33'/%3E%3C/g%3E%3C/svg%3E");
  background-size: 32px 32px;
  background-position: 5px 5px;
  background-repeat: no-repeat;
}

button#copy {
  background-image: url("data:image/svg+xml,%3Csvg height='48' viewBox='0 0 48 48' width='48' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 0h48v48h-48z' fill='none'/%3E%3Cpath d='M32 2h-24c-2.21 0-4 1.79-4 4v28h4v-28h24v-4zm6 8h-22c-2.21 0-4 1.79-4 4v28c0 2.21 1.79 4 4 4h22c2.21 0 4-1.79 4-4v-28c0-2.21-1.79-4-4-4zm0 32h-22v-28h22v28z'/%3E%3C/svg%3E");
  background-position: 6px 6px;
  background-repeat: no-repeat;
  background-size: 26px 26px;
  border-radius: 6px;
  height: 40px;
  width: 40px;
  margin: 10px 5px;
}

button#copy:active {
    box-shadow: inset 0px 0px 5px #6c6c6c;
}

textarea.clipboard-temp {
  position: fixed;
  top: 0;
  left: 0;
  width: 2em;
  height: 2em;
  padding: 0;
  border: None;
  outline: None;
  box-shadow: None;
  background: transparent;
}

.left-most-button {
  border-right: 0;
  border-top-left-radius: 6px;
  border-bottom-left-radius: 6px;
}

.middle-button {
  border-right: 0;
}

.right-most-button {
  border-top-right-radius: 6px;
  border-bottom-right-radius: 6px;
}

.button-container {
  font-size: 0;
  margin: 10px 10px 10px 0px;
}

.dark .button-container {
  filter: invert(1);
}

@media print {
  .hideonprint {
    display: none;
  }
}

canvas {
  cursor: crosshair;
}

canvas:active {
  cursor: grabbing;
}

.fileinfo {
  width: 100%;
  max-width: 1000px;
  border: none;
  padding: 5px;
}

.fileinfo .title {
  font-size: 20pt;
  font-weight: bold;
}

.fileinfo td {
  overflow: hidden;
  white-space: nowrap;
  max-width: 1px;
  width: 50%;
  text-overflow: ellipsis;
}

.bom {
  border-collapse: collapse;
  font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
  font-size: 10pt;
  table-layout: fixed;
  width: 100%;
  margin-top: 1px;
}

.bom th, .bom td {
  border: 1px solid black;
  padding: 5px;
  word-wrap: break-word;
  text-align: center;
  position: relative;
}

.dark .bom th, .dark .bom td {
  border: 1px solid #777;
}

.bom th {
  background-color: #CCCCCC;
  background-clip: padding-box;
}

.dark .bom th {
  background-color: #3b4749;
}

.bom tr.highlighted:nth-child(n) {
  background-color: #cfc;
}

.dark .bom tr.highlighted:nth-child(n) {
  background-color: #226022;
}

.bom tr:nth-child(even) {
  background-color: #f2f2f2;
}

.dark .bom tr:nth-child(even) {
  background-color: #313b40;
}

.bom tr {
  transition: background-color 0.2s;
}

.bom .numCol {
  width: 25px;
}

.bom .Description {
  width: 10%;
}

.bom .Part {
  width: 10%;
}

.bom .Value {
  width: 15%;
}

.bom .Quantity {
  width: 65px;
}

.bom th .sortmark {
  position: absolute;
  right: 1px;
  top: 1px;
  margin-top: -5px;
  border-width: 5px;
  border-style: solid;
  border-color: transparent transparent #221 transparent;
  transform-origin: 50% 85%;
  transition: opacity 0.2s, transform 0.4s;
}

.dark .bom th .sortmark {
  filter: invert(1);
}

.bom th .sortmark.none {
  opacity: 0;
}

.bom th .sortmark.desc {
  transform: rotate(180deg);
}

.bom th:hover .sortmark.none {
  opacity: 0.5;
}

.bom .bom-checkbox {
  width: 30px;
  position: relative;
  user-select: none;
  -moz-user-select: none;
}

.bom .bom-checkbox:before {
  content: "";
  position: absolute;
  border-width: 15px;
  border-style: solid;
  border-color: #51829f transparent transparent transparent;
  visibility: hidden;
  top: -15px;
}

.bom .bom-checkbox:after {
  content: "Double click to set/unset all";
  position: absolute;
  color: white;
  top: -35px;
  left: -26px;
  background: #51829f;
  padding: 5px 15px;
  border-radius: 8px;
  white-space: nowrap;
  visibility: hidden;
}

.bom .bom-checkbox:hover:before, .bom .bom-checkbox:hover:after {
  visibility: visible;
  transition: visibility 0.2s linear 1s;
}

.split {
  -webkit-box-sizing: border-box;
  -moz-box-sizing: border-box;
  box-sizing: border-box;
  overflow-y: auto;
  overflow-x: hidden;
  background-color: inherit;
}

.split.split-horizontal, .gutter.gutter-horizontal {
  height: 100%;
  float: left;
}

.gutter {
  background-color: #ddd;
  background-repeat: no-repeat;
  background-position: 50%;
  transition: background-color 0.3s;
}

.dark .gutter {
  background-color: #777;
}

.gutter.gutter-horizontal {
  background-image: url('');
  cursor: ew-resize;
  width: 5px;
}

.gutter.gutter-vertical {
  background-image: url('');
  cursor: ns-resize;
  height: 5px;
}

.searchbox {
  float: left;
  height: 40px;
  margin: 10px 5px;
  padding: 12px 32px;
  font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
  font-size: 18px;
  box-sizing: border-box;
  border: 1px solid #888;
  border-radius: 6px;
  outline: none;
  background-color: #eee;
  transition: background-color 0.2s, border 0.2s;
  background-image: url('');
  background-position: 10px 10px;
  background-repeat: no-repeat;
}

.dark .searchbox {
  background-color: #111;
  color: #eee;
}

.searchbox::placeholder {
  color: #ccc;
}

.dark .searchbox::placeholder {
  color: #666;
}

.filter {
  width: calc(60% - 64px);
}

.reflookup {
  width: calc(40% - 10px);
}

input[type=text]:focus {
  background-color: white;
  border: 1px solid #333;
}

.dark input[type=text]:focus {
  background-color: #333;
  border: 1px solid #ccc;
}

mark.highlight {
  background-color: #5050ff;
  color: #fff;
  padding: 2px;
  border-radius: 6px;
}

.dark mark.highlight {
  background-color: #76a6da;
  color: #111;
}

.menubtn {
  background-color: white;
  border: none;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='36' height='36' viewBox='0 0 20 20'%3E%3Cpath fill='none' d='M0 0h20v20H0V0z'/%3E%3Cpath d='M15.95 10.78c.03-.25.05-.51.05-.78s-.02-.53-.06-.78l1.69-1.32c.15-.12.19-.34.1-.51l-1.6-2.77c-.1-.18-.31-.24-.49-.18l-1.99.8c-.42-.32-.86-.58-1.35-.78L12 2.34c-.03-.2-.2-.34-.4-.34H8.4c-.2 0-.36.14-.39.34l-.3 2.12c-.49.2-.94.47-1.35.78l-1.99-.8c-.18-.07-.39 0-.49.18l-1.6 2.77c-.1.18-.06.39.1.51l1.69 1.32c-.04.25-.07.52-.07.78s.02.53.06.78L2.37 12.1c-.15.12-.19.34-.1.51l1.6 2.77c.1.18.31.24.49.18l1.99-.8c.42.32.86.58 1.35.78l.3 2.12c.04.2.2.34.4.34h3.2c.2 0 .37-.14.39-.34l.3-2.12c.49-.2.94-.47 1.35-.78l1.99.8c.18.07.39 0 .49-.18l1.6-2.77c.1-.18.06-.39-.1-.51l-1.67-1.32zM10 13c-1.65 0-3-1.35-3-3s1.35-3 3-3 3 1.35 3 3-1.35 3-3 3z'/%3E%3C/svg%3E%0A");
  background-position: center;
  background-repeat: no-repeat;
}

.statsbtn {
  background-color: white;
  border: none;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9.52 9.53'%3E%3Cg fill='none' stroke-width='.53'%3E%3Cpath d='M.8.8h7.4v7.67H.8z' stroke='%23666'/%3E%3Cpath d='M8.73 1.06V9H1.06' stroke='%23ccc'/%3E%3Cpath d='M1.85 2.12H3.7M4.5 2.12h1.06M6.09 2.12h1.05M1.85 3.44H3.7M4.5 3.44h1.06M6.09 3.44h1.05M1.85 5.3h1.33M1.85 6.88h1.32M3.97 6.88H6.6M3.97 5.3h3.17' stroke='%23000'/%3E%3C/g%3E%3C/svg%3E");
  background-position: center;
  background-repeat: no-repeat;
}

.iobtn {
  background-color: white;
  border: none;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='36' height='36'%3E%3Cpath fill='none' stroke='%23000' stroke-width='2' d='M3 33v-7l6.8-7h16.5l6.7 7v7H3zM3.2 26H33M21 9l5-5.9 5 6h-2.5V15h-5V9H21zm-4.9 0l-5 6-5-6h2.5V3h5v6h2.5z'/%3E%3Cpath fill='none' stroke='%23000' d='M6.1 29.5H10'/%3E%3C/svg%3E");
  background-position: center;
  background-repeat: no-repeat;
}

.dark .statsbtn, .dark .savebtn, .dark .menubtn, .dark .iobtn {
  filter: invert(1);
}

.flexbox {
  display: flex;
  align-items: center;
  justify-content: space-between;
  width: 100%;
}

.savebtn {
  background-color: #d6d6d6;
  width: auto;
  height: 30px;
  flex-grow: 1;
  margin: 5px;
  border-radius: 4px;
}

.savebtn:active {
  background-color: #0a0;
  color: white;
}

.dark .savebtn:active {
  /* This will be inverted */
  background-color: #b3b;
}

.stats {
  border-collapse: collapse;
  font-size: 12pt;
  table-layout: fixed;
  width: 100%;
  min-width: 450px;
}

.dark .stats td {
  border: 1px solid #bbb;
}

.stats td {
  border: 1px solid black;
  padding: 5px;
  word-wrap: break-word;
  text-align: center;
  position: relative;
}

#checkbox-stats div {
  position: absolute;
  left: 0;
  top: 0;
  height: 100%;
  width: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
}

#checkbox-stats .bar {
  background-color: rgba(28, 251, 0, 0.6);
}

.menu {
  position: relative;
  display: inline-block;
  margin: 10px 10px 10px 0px;
}

.menu-content {
  display: none;
  position: absolute;
  background-color: white;
  right: 0;
  min-width: 300px;
  box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2);
  z-index: 100;
  padding: 8px;
}

.dark .menu-content {
  background-color: #111;
}

.menu:hover .menu-content {
  display: block;
}

.menu:hover .menubtn, .menu:hover .iobtn, .menu:hover .statsbtn {
  background-color: #eee;
}

.menu-label {
  display: inline-block;
  padding: 8px;
  border: 1px solid #ccc;
  border-top: 0;
  width: calc(100% - 18px);
}

.menu-label-top {
  border-top: 1px solid #ccc;
}

.menu-textbox {
  float: left;
  height: 24px;
  margin: 10px 5px;
  padding: 5px 5px;
  font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
  font-size: 14px;
  box-sizing: border-box;
  border: 1px solid #888;
  border-radius: 4px;
  outline: none;
  background-color: #eee;
  transition: background-color 0.2s, border 0.2s;
  width: calc(100% - 10px);
}

.menu-textbox.invalid, .dark .menu-textbox.invalid {
  color: red;
}

.dark .menu-textbox {
  background-color: #222;
  color: #eee;
}

.topmostdiv {
  width: 100%;
  height: 100%;
  background-color: white;
  transition: background-color 0.3s;
}

#top {
  height: 78px;
  border-bottom: 2px solid black;
}

.dark #top {
  border-bottom: 2px solid #ccc;
}

#dbg {
  display: block;
}

::-webkit-scrollbar {
  width: 8px;
}

::-webkit-scrollbar-track {
  background: #aaa;
}

::-webkit-scrollbar-thumb {
  background: #666;
  border-radius: 3px;
}

::-webkit-scrollbar-thumb:hover {
  background: #555;
}

.slider {
  -webkit-appearance: none;
  width: 100%;
  margin: 3px 0;
  padding: 0;
  outline: none;
  opacity: 0.7;
  -webkit-transition: .2s;
  transition: opacity .2s;
  border-radius: 3px;
}

.slider:hover {
  opacity: 1;
}

.slider:focus {
  outline: none;
}

.slider::-webkit-slider-runnable-track {
  -webkit-appearance: none;
  width: 100%;
  height: 8px;
  background: #d3d3d3;
  border-radius: 3px;
  border: none;
}

.slider::-webkit-slider-thumb {
  -webkit-appearance: none;
  width: 15px;
  height: 15px;
  border-radius: 50%;
  background: #0a0;
  cursor: pointer;
  margin-top: -4px;
}

.dark .slider::-webkit-slider-thumb {
  background: #3d3;
}

.slider::-moz-range-thumb {
  width: 15px;
  height: 15px;
  border-radius: 50%;
  background: #0a0;
  cursor: pointer;
}

.slider::-moz-range-track {
  height: 8px;
  background: #d3d3d3;
  border-radius: 3px;
}

.dark .slider::-moz-range-thumb {
  background: #3d3;
}

.slider::-ms-track {
  width: 100%;
  height: 8px;
  border-width: 3px 0;
  background: transparent;
  border-color: transparent;
  color: transparent;
  transition: opacity .2s;
}

.slider::-ms-fill-lower {
  background: #d3d3d3;
  border: none;
  border-radius: 3px;
}

.slider::-ms-fill-upper {
  background: #d3d3d3;
  border: none;
  border-radius: 3px;
}

.slider::-ms-thumb {
  width: 15px;
  height: 15px;
  border-radius: 50%;
  background: #0a0;
  cursor: pointer;
  margin: 0;
}

.shameless-plug {
  font-size: 0.8em;
  text-align: center;
  display: block;
}

a {
  color: #0278a4;
}

.dark a {
  color: #00b9fd;
}

#frontcanvas, #backcanvas {
    touch-action: none;
}

  </style>
  <script type="text/javascript" >
///////////////////////////////////////////////
/*
  Split.js - v1.3.5
  MIT License
  https://github.com/nathancahill/Split.js
*/
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.Split=t()}(this,function(){"use strict";var e=window,t=e.document,n="addEventListener",i="removeEventListener",r="getBoundingClientRect",s=function(){return!1},o=e.attachEvent&&!e[n],a=["","-webkit-","-moz-","-o-"].filter(function(e){var n=t.createElement("div");return n.style.cssText="width:"+e+"calc(9px)",!!n.style.length}).shift()+"calc",l=function(e){return"string"==typeof e||e instanceof String?t.querySelector(e):e};return function(u,c){function z(e,t,n){var i=A(y,t,n);Object.keys(i).forEach(function(t){return e.style[t]=i[t]})}function h(e,t){var n=B(y,t);Object.keys(n).forEach(function(t){return e.style[t]=n[t]})}function f(e){var t=E[this.a],n=E[this.b],i=t.size+n.size;t.size=e/this.size*i,n.size=i-e/this.size*i,z(t.element,t.size,this.aGutterSize),z(n.element,n.size,this.bGutterSize)}function m(e){var t;this.dragging&&((t="touches"in e?e.touches[0][b]-this.start:e[b]-this.start)<=E[this.a].minSize+M+this.aGutterSize?t=E[this.a].minSize+this.aGutterSize:t>=this.size-(E[this.b].minSize+M+this.bGutterSize)&&(t=this.size-(E[this.b].minSize+this.bGutterSize)),f.call(this,t),c.onDrag&&c.onDrag())}function g(){var e=E[this.a].element,t=E[this.b].element;this.size=e[r]()[y]+t[r]()[y]+this.aGutterSize+this.bGutterSize,this.start=e[r]()[G]}function d(){var t=this,n=E[t.a].element,r=E[t.b].element;t.dragging&&c.onDragEnd&&c.onDragEnd(),t.dragging=!1,e[i]("mouseup",t.stop),e[i]("touchend",t.stop),e[i]("touchcancel",t.stop),t.parent[i]("mousemove",t.move),t.parent[i]("touchmove",t.move),delete t.stop,delete t.move,n[i]("selectstart",s),n[i]("dragstart",s),r[i]("selectstart",s),r[i]("dragstart",s),n.style.userSelect="",n.style.webkitUserSelect="",n.style.MozUserSelect="",n.style.pointerEvents="",r.style.userSelect="",r.style.webkitUserSelect="",r.style.MozUserSelect="",r.style.pointerEvents="",t.gutter.style.cursor="",t.parent.style.cursor=""}function S(t){var i=this,r=E[i.a].element,o=E[i.b].element;!i.dragging&&c.onDragStart&&c.onDragStart(),t.preventDefault(),i.dragging=!0,i.move=m.bind(i),i.stop=d.bind(i),e[n]("mouseup",i.stop),e[n]("touchend",i.stop),e[n]("touchcancel",i.stop),i.parent[n]("mousemove",i.move),i.parent[n]("touchmove",i.move),r[n]("selectstart",s),r[n]("dragstart",s),o[n]("selectstart",s),o[n]("dragstart",s),r.style.userSelect="none",r.style.webkitUserSelect="none",r.style.MozUserSelect="none",r.style.pointerEvents="none",o.style.userSelect="none",o.style.webkitUserSelect="none",o.style.MozUserSelect="none",o.style.pointerEvents="none",i.gutter.style.cursor=j,i.parent.style.cursor=j,g.call(i)}function v(e){e.forEach(function(t,n){if(n>0){var i=F[n-1],r=E[i.a],s=E[i.b];r.size=e[n-1],s.size=t,z(r.element,r.size,i.aGutterSize),z(s.element,s.size,i.bGutterSize)}})}function p(){F.forEach(function(e){e.parent.removeChild(e.gutter),E[e.a].element.style[y]="",E[e.b].element.style[y]=""})}void 0===c&&(c={});var y,b,G,E,w=l(u[0]).parentNode,D=e.getComputedStyle(w).flexDirection,U=c.sizes||u.map(function(){return 100/u.length}),k=void 0!==c.minSize?c.minSize:100,x=Array.isArray(k)?k:u.map(function(){return k}),L=void 0!==c.gutterSize?c.gutterSize:10,M=void 0!==c.snapOffset?c.snapOffset:30,O=c.direction||"horizontal",j=c.cursor||("horizontal"===O?"ew-resize":"ns-resize"),C=c.gutter||function(e,n){var i=t.createElement("div");return i.className="gutter gutter-"+n,i},A=c.elementStyle||function(e,t,n){var i={};return"string"==typeof t||t instanceof String?i[e]=t:i[e]=o?t+"%":a+"("+t+"% - "+n+"px)",i},B=c.gutterStyle||function(e,t){return n={},n[e]=t+"px",n;var n};"horizontal"===O?(y="width","clientWidth",b="clientX",G="left","paddingLeft"):"vertical"===O&&(y="height","clientHeight",b="clientY",G="top","paddingTop");var F=[];return E=u.map(function(e,t){var i,s={element:l(e),size:U[t],minSize:x[t]};if(t>0&&(i={a:t-1,b:t,dragging:!1,isFirst:1===t,isLast:t===u.length-1,direction:O,parent:w},i.aGutterSize=L,i.bGutterSize=L,i.isFirst&&(i.aGutterSize=L/2),i.isLast&&(i.bGutterSize=L/2),"row-reverse"===D||"column-reverse"===D)){var a=i.a;i.a=i.b,i.b=a}if(!o&&t>0){var c=C(t,O);h(c,L),c[n]("mousedown",S.bind(i)),c[n]("touchstart",S.bind(i)),w.insertBefore(c,s.element),i.gutter=c}0===t||t===u.length-1?z(s.element,s.size,L/2):z(s.element,s.size,L);var f=s.element[r]()[y];return f<s.minSize&&(s.minSize=f),t>0&&F.push(i),s}),o?{setSizes:v,destroy:p}:{setSizes:v,getSizes:function(){return E.map(function(e){return e.size})},collapse:function(e){if(e===F.length){var t=F[e-1];g.call(t),o||f.call(t,t.size-t.bGutterSize)}else{var n=F[e];g.call(n),o||f.call(n,n.aGutterSize)}},destroy:p}}});

///////////////////////////////////////////////

///////////////////////////////////////////////
// Copyright (c) 2013 Pieroxy <pieroxy@pieroxy.net>
// This work is free. You can redistribute it and/or modify it
// under the terms of the WTFPL, Version 2
// For more information see LICENSE.txt or http://www.wtfpl.net/
//
// For more information, the home page:
// http://pieroxy.net/blog/pages/lz-string/testing.html
//
// LZ-based compression algorithm, version 1.4.4
var LZString=function(){var o=String.fromCharCode,i={};var n={decompressFromBase64:function(o){return null==o?"":""==o?null:n._decompress(o.length,32,function(n){return function(o,n){if(!i[o]){i[o]={};for(var t=0;t<o.length;t++)i[o][o.charAt(t)]=t}return i[o][n]}("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",o.charAt(n))})},_decompress:function(i,n,t){var r,e,a,s,p,u,l,f=[],c=4,d=4,h=3,v="",g=[],m={val:t(0),position:n,index:1};for(r=0;r<3;r+=1)f[r]=r;for(a=0,p=Math.pow(2,2),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;switch(a){case 0:for(a=0,p=Math.pow(2,8),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;l=o(a);break;case 1:for(a=0,p=Math.pow(2,16),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;l=o(a);break;case 2:return""}for(f[3]=l,e=l,g.push(l);;){if(m.index>i)return"";for(a=0,p=Math.pow(2,h),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;switch(l=a){case 0:for(a=0,p=Math.pow(2,8),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;f[d++]=o(a),l=d-1,c--;break;case 1:for(a=0,p=Math.pow(2,16),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;f[d++]=o(a),l=d-1,c--;break;case 2:return g.join("")}if(0==c&&(c=Math.pow(2,h),h++),f[l])v=f[l];else{if(l!==d)return null;v=e+e.charAt(0)}g.push(v),f[d++]=e+v.charAt(0),e=v,0==--c&&(c=Math.pow(2,h),h++)}}};return n}();"function"==typeof define&&define.amd?define(function(){return LZString}):"undefined"!=typeof module&&null!=module?module.exports=LZString:"undefined"!=typeof angular&&null!=angular&&angular.module("LZString",[]).factory("LZString",function(){return LZString});
///////////////////////////////////////////////

///////////////////////////////////////////////
/*!
 * PEP v0.4.3 | https://github.com/jquery/PEP
 * Copyright jQuery Foundation and other contributors | http://jquery.org/license
 */
!function(a,b){"object"==typeof exports&&"undefined"!=typeof module?module.exports=b():"function"==typeof define&&define.amd?define(b):a.PointerEventsPolyfill=b()}(this,function(){"use strict";function a(a,b){b=b||Object.create(null);var c=document.createEvent("Event");c.initEvent(a,b.bubbles||!1,b.cancelable||!1);
for(var d,e=2;e<m.length;e++)d=m[e],c[d]=b[d]||n[e];c.buttons=b.buttons||0;
var f=0;return f=b.pressure&&c.buttons?b.pressure:c.buttons?.5:0,c.x=c.clientX,c.y=c.clientY,c.pointerId=b.pointerId||0,c.width=b.width||0,c.height=b.height||0,c.pressure=f,c.tiltX=b.tiltX||0,c.tiltY=b.tiltY||0,c.twist=b.twist||0,c.tangentialPressure=b.tangentialPressure||0,c.pointerType=b.pointerType||"",c.hwTimestamp=b.hwTimestamp||0,c.isPrimary=b.isPrimary||!1,c}function b(){this.array=[],this.size=0}function c(a,b,c,d){this.addCallback=a.bind(d),this.removeCallback=b.bind(d),this.changedCallback=c.bind(d),A&&(this.observer=new A(this.mutationWatcher.bind(this)))}function d(a){return"body /shadow-deep/ "+e(a)}function e(a){return'[touch-action="'+a+'"]'}function f(a){return"{ -ms-touch-action: "+a+"; touch-action: "+a+"; }"}function g(){if(F){D.forEach(function(a){String(a)===a?(E+=e(a)+f(a)+"\n",G&&(E+=d(a)+f(a)+"\n")):(E+=a.selectors.map(e)+f(a.rule)+"\n",G&&(E+=a.selectors.map(d)+f(a.rule)+"\n"))});var a=document.createElement("style");a.textContent=E,document.head.appendChild(a)}}function h(){if(!window.PointerEvent){if(window.PointerEvent=a,window.navigator.msPointerEnabled){var b=window.navigator.msMaxTouchPoints;Object.defineProperty(window.navigator,"maxTouchPoints",{value:b,enumerable:!0}),u.registerSource("ms",_)}else Object.defineProperty(window.navigator,"maxTouchPoints",{value:0,enumerable:!0}),u.registerSource("mouse",N),void 0!==window.ontouchstart&&u.registerSource("touch",V);u.register(document)}}function i(a){if(!u.pointermap.has(a)){var b=new Error("InvalidPointerId");throw b.name="InvalidPointerId",b}}function j(a){for(var b=a.parentNode;b&&b!==a.ownerDocument;)b=b.parentNode;if(!b){var c=new Error("InvalidStateError");throw c.name="InvalidStateError",c}}function k(a){var b=u.pointermap.get(a);return 0!==b.buttons}function l(){window.Element&&!Element.prototype.setPointerCapture&&Object.defineProperties(Element.prototype,{setPointerCapture:{value:W},releasePointerCapture:{value:X},hasPointerCapture:{value:Y}})}
var m=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","pageX","pageY"],n=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0],o=window.Map&&window.Map.prototype.forEach,p=o?Map:b;b.prototype={set:function(a,b){return void 0===b?this["delete"](a):(this.has(a)||this.size++,void(this.array[a]=b))},has:function(a){return void 0!==this.array[a]},"delete":function(a){this.has(a)&&(delete this.array[a],this.size--)},get:function(a){return this.array[a]},clear:function(){this.array.length=0,this.size=0},forEach:function(a,b){return this.array.forEach(function(c,d){a.call(b,c,d,this)},this)}};var q=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","buttons","pointerId","width","height","pressure","tiltX","tiltY","pointerType","hwTimestamp","isPrimary","type","target","currentTarget","which","pageX","pageY","timeStamp"],r=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0,0,0,0,0,0,"",0,!1,"",null,null,0,0,0,0],s={pointerover:1,pointerout:1,pointerenter:1,pointerleave:1},t="undefined"!=typeof SVGElementInstance,u={pointermap:new p,eventMap:Object.create(null),captureInfo:Object.create(null),eventSources:Object.create(null),eventSourceList:[],registerSource:function(a,b){var c=b,d=c.events;d&&(d.forEach(function(a){c[a]&&(this.eventMap[a]=c[a].bind(c))},this),this.eventSources[a]=c,this.eventSourceList.push(c))},register:function(a){for(var b,c=this.eventSourceList.length,d=0;d<c&&(b=this.eventSourceList[d]);d++)
b.register.call(b,a)},unregister:function(a){for(var b,c=this.eventSourceList.length,d=0;d<c&&(b=this.eventSourceList[d]);d++)
b.unregister.call(b,a)},contains:function(a,b){try{return a.contains(b)}catch(c){return!1}},down:function(a){a.bubbles=!0,this.fireEvent("pointerdown",a)},move:function(a){a.bubbles=!0,this.fireEvent("pointermove",a)},up:function(a){a.bubbles=!0,this.fireEvent("pointerup",a)},enter:function(a){a.bubbles=!1,this.fireEvent("pointerenter",a)},leave:function(a){a.bubbles=!1,this.fireEvent("pointerleave",a)},over:function(a){a.bubbles=!0,this.fireEvent("pointerover",a)},out:function(a){a.bubbles=!0,this.fireEvent("pointerout",a)},cancel:function(a){a.bubbles=!0,this.fireEvent("pointercancel",a)},leaveOut:function(a){this.out(a),this.propagate(a,this.leave,!1)},enterOver:function(a){this.over(a),this.propagate(a,this.enter,!0)},eventHandler:function(a){if(!a._handledByPE){var b=a.type,c=this.eventMap&&this.eventMap[b];c&&c(a),a._handledByPE=!0}},listen:function(a,b){b.forEach(function(b){this.addEvent(a,b)},this)},unlisten:function(a,b){b.forEach(function(b){this.removeEvent(a,b)},this)},addEvent:function(a,b){a.addEventListener(b,this.boundHandler)},removeEvent:function(a,b){a.removeEventListener(b,this.boundHandler)},makeEvent:function(b,c){this.captureInfo[c.pointerId]&&(c.relatedTarget=null);var d=new a(b,c);return c.preventDefault&&(d.preventDefault=c.preventDefault),d._target=d._target||c.target,d},fireEvent:function(a,b){var c=this.makeEvent(a,b);return this.dispatchEvent(c)},cloneEvent:function(a){for(var b,c=Object.create(null),d=0;d<q.length;d++)b=q[d],c[b]=a[b]||r[d],!t||"target"!==b&&"relatedTarget"!==b||c[b]instanceof SVGElementInstance&&(c[b]=c[b].correspondingUseElement);return a.preventDefault&&(c.preventDefault=function(){a.preventDefault()}),c},getTarget:function(a){var b=this.captureInfo[a.pointerId];return b?a._target!==b&&a.type in s?void 0:b:a._target},propagate:function(a,b,c){for(var d=a.target,e=[];d!==document&&!d.contains(a.relatedTarget);) if(e.push(d),d=d.parentNode,!d)return;c&&e.reverse(),e.forEach(function(c){a.target=c,b.call(this,a)},this)},setCapture:function(b,c,d){this.captureInfo[b]&&this.releaseCapture(b,d),this.captureInfo[b]=c,this.implicitRelease=this.releaseCapture.bind(this,b,d),document.addEventListener("pointerup",this.implicitRelease),document.addEventListener("pointercancel",this.implicitRelease);var e=new a("gotpointercapture");e.pointerId=b,e._target=c,d||this.asyncDispatchEvent(e)},releaseCapture:function(b,c){var d=this.captureInfo[b];if(d){this.captureInfo[b]=void 0,document.removeEventListener("pointerup",this.implicitRelease),document.removeEventListener("pointercancel",this.implicitRelease);var e=new a("lostpointercapture");e.pointerId=b,e._target=d,c||this.asyncDispatchEvent(e)}},dispatchEvent:/*scope.external.dispatchEvent || */function(a){var b=this.getTarget(a);if(b)return b.dispatchEvent(a)},asyncDispatchEvent:function(a){requestAnimationFrame(this.dispatchEvent.bind(this,a))}};u.boundHandler=u.eventHandler.bind(u);var v={shadow:function(a){if(a)return a.shadowRoot||a.webkitShadowRoot},canTarget:function(a){return a&&Boolean(a.elementFromPoint)},targetingShadow:function(a){var b=this.shadow(a);if(this.canTarget(b))return b},olderShadow:function(a){var b=a.olderShadowRoot;if(!b){var c=a.querySelector("shadow");c&&(b=c.olderShadowRoot)}return b},allShadows:function(a){for(var b=[],c=this.shadow(a);c;)b.push(c),c=this.olderShadow(c);return b},searchRoot:function(a,b,c){if(a){var d,e,f=a.elementFromPoint(b,c);for(e=this.targetingShadow(f);e;){if(d=e.elementFromPoint(b,c)){var g=this.targetingShadow(d);return this.searchRoot(g,b,c)||d} e=this.olderShadow(e)} return f}},owner:function(a){
for(var b=a;b.parentNode;)b=b.parentNode;
return b.nodeType!==Node.DOCUMENT_NODE&&b.nodeType!==Node.DOCUMENT_FRAGMENT_NODE&&(b=document),b},findTarget:function(a){var b=a.clientX,c=a.clientY,d=this.owner(a.target);
return d.elementFromPoint(b,c)||(d=document),this.searchRoot(d,b,c)}},w=Array.prototype.forEach.call.bind(Array.prototype.forEach),x=Array.prototype.map.call.bind(Array.prototype.map),y=Array.prototype.slice.call.bind(Array.prototype.slice),z=Array.prototype.filter.call.bind(Array.prototype.filter),A=window.MutationObserver||window.WebKitMutationObserver,B="[touch-action]",C={subtree:!0,childList:!0,attributes:!0,attributeOldValue:!0,attributeFilter:["touch-action"]};c.prototype={watchSubtree:function(a){
//
this.observer&&v.canTarget(a)&&this.observer.observe(a,C)},enableOnSubtree:function(a){this.watchSubtree(a),a===document&&"complete"!==document.readyState?this.installOnLoad():this.installNewSubtree(a)},installNewSubtree:function(a){w(this.findElements(a),this.addElement,this)},findElements:function(a){return a.querySelectorAll?a.querySelectorAll(B):[]},removeElement:function(a){this.removeCallback(a)},addElement:function(a){this.addCallback(a)},elementChanged:function(a,b){this.changedCallback(a,b)},concatLists:function(a,b){return a.concat(y(b))},
installOnLoad:function(){document.addEventListener("readystatechange",function(){"complete"===document.readyState&&this.installNewSubtree(document)}.bind(this))},isElement:function(a){return a.nodeType===Node.ELEMENT_NODE},flattenMutationTree:function(a){
var b=x(a,this.findElements,this);
return b.push(z(a,this.isElement)),b.reduce(this.concatLists,[])},mutationWatcher:function(a){a.forEach(this.mutationHandler,this)},mutationHandler:function(a){if("childList"===a.type){var b=this.flattenMutationTree(a.addedNodes);b.forEach(this.addElement,this);var c=this.flattenMutationTree(a.removedNodes);c.forEach(this.removeElement,this)}else"attributes"===a.type&&this.elementChanged(a.target,a.oldValue)}};var D=["none","auto","pan-x","pan-y",{rule:"pan-x pan-y",selectors:["pan-x pan-y","pan-y pan-x"]}],E="",F=window.PointerEvent||window.MSPointerEvent,G=!window.ShadowDOMPolyfill&&document.head.createShadowRoot,H=u.pointermap,I=25,J=[1,4,2,8,16],K=!1;try{K=1===new MouseEvent("test",{buttons:1}).buttons}catch(L){}
var M,N={POINTER_ID:1,POINTER_TYPE:"mouse",events:["mousedown","mousemove","mouseup","mouseover","mouseout"],register:function(a){u.listen(a,this.events)},unregister:function(a){u.unlisten(a,this.events)},lastTouches:[],
isEventSimulatedFromTouch:function(a){for(var b,c=this.lastTouches,d=a.clientX,e=a.clientY,f=0,g=c.length;f<g&&(b=c[f]);f++){
var h=Math.abs(d-b.x),i=Math.abs(e-b.y);if(h<=I&&i<=I)return!0}},prepareEvent:function(a){var b=u.cloneEvent(a),c=b.preventDefault;return b.preventDefault=function(){a.preventDefault(),c()},b.pointerId=this.POINTER_ID,b.isPrimary=!0,b.pointerType=this.POINTER_TYPE,b},prepareButtonsForMove:function(a,b){var c=H.get(this.POINTER_ID);
0!==b.which&&c?a.buttons=c.buttons:a.buttons=0,b.buttons=a.buttons},mousedown:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=H.get(this.POINTER_ID),c=this.prepareEvent(a);K||(c.buttons=J[c.button],b&&(c.buttons|=b.buttons),a.buttons=c.buttons),H.set(this.POINTER_ID,a),b&&0!==b.buttons?u.move(c):u.down(c)}},mousemove:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,H.set(this.POINTER_ID,a),u.move(b)}},mouseup:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=H.get(this.POINTER_ID),c=this.prepareEvent(a);if(!K){var d=J[c.button];
c.buttons=b?b.buttons&~d:0,a.buttons=c.buttons}H.set(this.POINTER_ID,a),
c.buttons&=~J[c.button],0===c.buttons?u.up(c):u.move(c)}},mouseover:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,H.set(this.POINTER_ID,a),u.enterOver(b)}},mouseout:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,u.leaveOut(b)}},cancel:function(a){var b=this.prepareEvent(a);u.cancel(b),this.deactivateMouse()},deactivateMouse:function(){H["delete"](this.POINTER_ID)}},O=u.captureInfo,P=v.findTarget.bind(v),Q=v.allShadows.bind(v),R=u.pointermap,S=2500,T=200,U="touch-action",V={events:["touchstart","touchmove","touchend","touchcancel"],register:function(a){M.enableOnSubtree(a)},unregister:function(){},elementAdded:function(a){var b=a.getAttribute(U),c=this.touchActionToScrollType(b);c&&(a._scrollType=c,u.listen(a,this.events),
Q(a).forEach(function(a){a._scrollType=c,u.listen(a,this.events)},this))},elementRemoved:function(a){a._scrollType=void 0,u.unlisten(a,this.events),
Q(a).forEach(function(a){a._scrollType=void 0,u.unlisten(a,this.events)},this)},elementChanged:function(a,b){var c=a.getAttribute(U),d=this.touchActionToScrollType(c),e=this.touchActionToScrollType(b);
d&&e?(a._scrollType=d,Q(a).forEach(function(a){a._scrollType=d},this)):e?this.elementRemoved(a):d&&this.elementAdded(a)},scrollTypes:{EMITTER:"none",XSCROLLER:"pan-x",YSCROLLER:"pan-y",SCROLLER:/^(?:pan-x pan-y)|(?:pan-y pan-x)|auto$/},touchActionToScrollType:function(a){var b=a,c=this.scrollTypes;return"none"===b?"none":b===c.XSCROLLER?"X":b===c.YSCROLLER?"Y":c.SCROLLER.exec(b)?"XY":void 0},POINTER_TYPE:"touch",firstTouch:null,isPrimaryTouch:function(a){return this.firstTouch===a.identifier},setPrimaryTouch:function(a){
(0===R.size||1===R.size&&R.has(1))&&(this.firstTouch=a.identifier,this.firstXY={X:a.clientX,Y:a.clientY},this.scrolling=!1,this.cancelResetClickCount())},removePrimaryPointer:function(a){a.isPrimary&&(this.firstTouch=null,this.firstXY=null,this.resetClickCount())},clickCount:0,resetId:null,resetClickCount:function(){var a=function(){this.clickCount=0,this.resetId=null}.bind(this);this.resetId=setTimeout(a,T)},cancelResetClickCount:function(){this.resetId&&clearTimeout(this.resetId)},typeToButtons:function(a){var b=0;return"touchstart"!==a&&"touchmove"!==a||(b=1),b},touchToPointer:function(a){var b=this.currentTouchEvent,c=u.cloneEvent(a),d=c.pointerId=a.identifier+2;c.target=O[d]||P(c),c.bubbles=!0,c.cancelable=!0,c.detail=this.clickCount,c.button=0,c.buttons=this.typeToButtons(b.type),c.width=2*(a.radiusX||a.webkitRadiusX||0),c.height=2*(a.radiusY||a.webkitRadiusY||0),c.pressure=a.force||a.webkitForce||.5,c.isPrimary=this.isPrimaryTouch(a),c.pointerType=this.POINTER_TYPE,
c.altKey=b.altKey,c.ctrlKey=b.ctrlKey,c.metaKey=b.metaKey,c.shiftKey=b.shiftKey;
var e=this;return c.preventDefault=function(){e.scrolling=!1,e.firstXY=null,b.preventDefault()},c},processTouches:function(a,b){var c=a.changedTouches;this.currentTouchEvent=a;for(var d,e=0;e<c.length;e++)d=c[e],b.call(this,this.touchToPointer(d))},
shouldScroll:function(a){if(this.firstXY){var b,c=a.currentTarget._scrollType;if("none"===c)
b=!1;else if("XY"===c)
b=!0;else{var d=a.changedTouches[0],e=c,f="Y"===c?"X":"Y",g=Math.abs(d["client"+e]-this.firstXY[e]),h=Math.abs(d["client"+f]-this.firstXY[f]);
b=g>=h}return this.firstXY=null,b}},findTouch:function(a,b){for(var c,d=0,e=a.length;d<e&&(c=a[d]);d++)if(c.identifier===b)return!0},
vacuumTouches:function(a){var b=a.touches;
if(R.size>=b.length){var c=[];R.forEach(function(a,d){
if(1!==d&&!this.findTouch(b,d-2)){var e=a.out;c.push(e)}},this),c.forEach(this.cancelOut,this)}},touchstart:function(a){this.vacuumTouches(a),this.setPrimaryTouch(a.changedTouches[0]),this.dedupSynthMouse(a),this.scrolling||(this.clickCount++,this.processTouches(a,this.overDown))},overDown:function(a){R.set(a.pointerId,{target:a.target,out:a,outTarget:a.target}),u.enterOver(a),u.down(a)},touchmove:function(a){this.scrolling||(this.shouldScroll(a)?(this.scrolling=!0,this.touchcancel(a)):(a.preventDefault(),this.processTouches(a,this.moveOverOut)))},moveOverOut:function(a){var b=a,c=R.get(b.pointerId);
if(c){var d=c.out,e=c.outTarget;u.move(b),d&&e!==b.target&&(d.relatedTarget=b.target,b.relatedTarget=e,
d.target=e,b.target?(u.leaveOut(d),u.enterOver(b)):(
b.target=e,b.relatedTarget=null,this.cancelOut(b))),c.out=b,c.outTarget=b.target}},touchend:function(a){this.dedupSynthMouse(a),this.processTouches(a,this.upOut)},upOut:function(a){this.scrolling||(u.up(a),u.leaveOut(a)),this.cleanUpPointer(a)},touchcancel:function(a){this.processTouches(a,this.cancelOut)},cancelOut:function(a){u.cancel(a),u.leaveOut(a),this.cleanUpPointer(a)},cleanUpPointer:function(a){R["delete"](a.pointerId),this.removePrimaryPointer(a)},
dedupSynthMouse:function(a){var b=N.lastTouches,c=a.changedTouches[0];
if(this.isPrimaryTouch(c)){
var d={x:c.clientX,y:c.clientY};b.push(d);var e=function(a,b){var c=a.indexOf(b);c>-1&&a.splice(c,1)}.bind(null,b,d);setTimeout(e,S)}}};M=new c(V.elementAdded,V.elementRemoved,V.elementChanged,V);var W,X,Y,Z=u.pointermap,$=window.MSPointerEvent&&"number"==typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE,_={events:["MSPointerDown","MSPointerMove","MSPointerUp","MSPointerOut","MSPointerOver","MSPointerCancel","MSGotPointerCapture","MSLostPointerCapture"],register:function(a){u.listen(a,this.events)},unregister:function(a){u.unlisten(a,this.events)},POINTER_TYPES:["","unavailable","touch","pen","mouse"],prepareEvent:function(a){var b=a;return $&&(b=u.cloneEvent(a),b.pointerType=this.POINTER_TYPES[a.pointerType]),b},cleanup:function(a){Z["delete"](a)},MSPointerDown:function(a){Z.set(a.pointerId,a);var b=this.prepareEvent(a);u.down(b)},MSPointerMove:function(a){var b=this.prepareEvent(a);u.move(b)},MSPointerUp:function(a){var b=this.prepareEvent(a);u.up(b),this.cleanup(a.pointerId)},MSPointerOut:function(a){var b=this.prepareEvent(a);u.leaveOut(b)},MSPointerOver:function(a){var b=this.prepareEvent(a);u.enterOver(b)},MSPointerCancel:function(a){var b=this.prepareEvent(a);u.cancel(b),this.cleanup(a.pointerId)},MSLostPointerCapture:function(a){var b=u.makeEvent("lostpointercapture",a);u.dispatchEvent(b)},MSGotPointerCapture:function(a){var b=u.makeEvent("gotpointercapture",a);u.dispatchEvent(b)}},aa=window.navigator;aa.msPointerEnabled?(W=function(a){i(a),j(this),k(a)&&(u.setCapture(a,this,!0),this.msSetPointerCapture(a))},X=function(a){i(a),u.releaseCapture(a,!0),this.msReleasePointerCapture(a)}):(W=function(a){i(a),j(this),k(a)&&u.setCapture(a,this)},X=function(a){i(a),u.releaseCapture(a)}),Y=function(a){return!!u.captureInfo[a]},g(),h(),l();var ba={dispatcher:u,Installer:c,PointerEvent:a,PointerMap:p,targetFinding:v};return ba});

///////////////////////////////////////////////

///////////////////////////////////////////////
var config = {"show_fabrication": false, "redraw_on_drag": true, "highlight_pin1": false, "extra_fields": [], "dark_mode": false, "bom_view": "left-right", "board_rotation": 0, "checkboxes": "Sourced,Placed", "show_silkscreen": true, "show_pads": true, "layer_view": "FB"}
///////////////////////////////////////////////

///////////////////////////////////////////////
var pcbdata = JSON.parse(LZString.decompressFromBase64("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"))
///////////////////////////////////////////////

///////////////////////////////////////////////
/* Utility functions */

var storagePrefix = 'KiCad_HTML_BOM__' + pcbdata.metadata.title + '__' +
  pcbdata.metadata.revision + '__#';
var storage;

function initStorage(key) {
  try {
    window.localStorage.getItem("blank");
    storage = window.localStorage;
  } catch (e) {
    // localStorage not available
  }
  if (!storage) {
    try {
      window.sessionStorage.getItem("blank");
      storage = window.sessionStorage;
    } catch (e) {
      // sessionStorage also not available
    }
  }
}

function readStorage(key) {
  if (storage) {
    return storage.getItem(storagePrefix + key);
  } else {
    return null;
  }
}

function writeStorage(key, value) {
  if (storage) {
    storage.setItem(storagePrefix + key, value);
  }
}

function fancyDblClickHandler(el, onsingle, ondouble) {
  return function() {
    if (el.getAttribute("data-dblclick") == null) {
      el.setAttribute("data-dblclick", 1);
      setTimeout(function() {
        if (el.getAttribute("data-dblclick") == 1) {
          onsingle();
        }
        el.removeAttribute("data-dblclick");
      }, 200);
    } else {
      el.removeAttribute("data-dblclick");
      ondouble();
    }
  }
}

function smoothScrollToRow(rowid) {
  document.getElementById(rowid).scrollIntoView({
    behavior: "smooth",
    block: "center",
    inline: "nearest"
  });
}

function focusInputField(input) {
  input.scrollIntoView(false);
  input.focus();
  input.select();
}

function copyToClipboard() {
  var text = '';
  for (var node of bomhead.childNodes[0].childNodes) {
    if (node.firstChild) {
      text = text + node.firstChild.nodeValue;
    }
    if (node != bomhead.childNodes[0].lastChild) {
      text += '\t';
    }
  }
  text += '\n';
  for (var row of bombody.childNodes) {
    for (var cell of row.childNodes) {
      for (var node of cell.childNodes) {
        if (node.nodeName == "INPUT") {
          if (node.checked) {
            text = text + '✓';
          }
        } else if (node.nodeName == "MARK") {
          text = text + node.firstChild.nodeValue;
        } else {
          text = text + node.nodeValue;
        }
      }
      if (cell != row.lastChild) {
        text += '\t';
      }
    }
    text += '\n';
  }
  var textArea = document.createElement("textarea");
  textArea.classList.add('clipboard-temp');
  textArea.value = text;

  document.body.appendChild(textArea);
  textArea.focus();
  textArea.select();

  try {
    if (document.execCommand('copy')) {
      console.log('Bom copied to clipboard.');
    }
  } catch (err) {
    console.log('Can not copy to clipboard.');
  }

  document.body.removeChild(textArea);
}

function removeGutterNode(node) {
  for (var i = 0; i < node.childNodes.length; i++) {
    if (node.childNodes[i].classList &&
      node.childNodes[i].classList.contains("gutter")) {
      node.removeChild(node.childNodes[i]);
      break;
    }
  }
}

function cleanGutters() {
  removeGutterNode(document.getElementById("bot"));
  removeGutterNode(document.getElementById("canvasdiv"));
}

var units = {
  prefixes: {
    giga: ["G", "g", "giga", "Giga", "GIGA"],
    mega: ["M", "mega", "Mega", "MEGA"],
    kilo: ["K", "k", "kilo", "Kilo", "KILO"],
    milli: ["m", "milli", "Milli", "MILLI"],
    micro: ["U", "u", "micro", "Micro", "MICRO", "μ", "µ"], // different utf8 μ
    nano: ["N", "n", "nano", "Nano", "NANO"],
    pico: ["P", "p", "pico", "Pico", "PICO"],
  },
  unitsShort: ["R", "r", "Ω", "F", "f", "H", "h"],
  unitsLong: [
    "OHM", "Ohm", "ohm", "ohms",
    "FARAD", "Farad", "farad",
    "HENRY", "Henry", "henry"
  ],
  getMultiplier: function(s) {
    if (this.prefixes.giga.includes(s)) return 1e9;
    if (this.prefixes.mega.includes(s)) return 1e6;
    if (this.prefixes.kilo.includes(s)) return 1e3;
    if (this.prefixes.milli.includes(s)) return 1e-3;
    if (this.prefixes.micro.includes(s)) return 1e-6;
    if (this.prefixes.nano.includes(s)) return 1e-9;
    if (this.prefixes.pico.includes(s)) return 1e-12;
    return 1;
  },
  valueRegex: null,
}

function initUtils() {
  var allPrefixes = units.prefixes.giga
                    .concat(units.prefixes.mega)
                    .concat(units.prefixes.kilo)
                    .concat(units.prefixes.milli)
                    .concat(units.prefixes.micro)
                    .concat(units.prefixes.nano)
                    .concat(units.prefixes.pico);
  var allUnits = units.unitsShort.concat(units.unitsLong);
  units.valueRegex = new RegExp("^([0-9\.]+)" +
                         "\\s*(" + allPrefixes.join("|") + ")?" +
                         "(" + allUnits.join("|") + ")?" +
                         "(\\b.*)?$", "");
  units.valueAltRegex = new RegExp("^([0-9]*)" +
                         "(" + units.unitsShort.join("|") + ")?" +
                         "([GgMmKkUuNnPp])?" +
                         "([0-9]*)" +
                         "(\\b.*)?$", "");
  for (var bom_type of ["both", "F", "B"]) {
    for (var row of pcbdata.bom[bom_type]) {
      row.push(parseValue(row[1], row[3][0][0]));
    }
  }
}

function parseValue(val, ref) {
  var inferUnit = (unit, ref) => {
    if (unit) {
      unit = unit.toLowerCase();
      if (unit == 'Ω' || unit == "ohm" || unit == "ohms") {
        unit = 'r';
      }
      unit = unit[0];
    } else {
      ref = /^([a-z]+)\d+$/i.exec(ref);
      if (ref) {
        ref = ref[1].toLowerCase();
        if (ref == "c") unit = 'f';
        else if (ref == "l") unit = 'h';
        else if (ref == "r" || ref == "rv") unit = 'r';
        else unit = null;
      }
    }
    return unit;
  };
  val = val.replace(/,/g, "");
  var match = units.valueRegex.exec(val);
  var unit;
  if (match) {
    val = parseFloat(match[1]);
    if (match[2]) {
      val = val * units.getMultiplier(match[2]);
    }
    unit = inferUnit(match[3], ref);
    if (!unit) return null;
    else return {
      val: val,
      unit: unit,
      extra: match[4],
    }
  }
  match = units.valueAltRegex.exec(val);
  if (match && (match[1] || match[4])) {
    val = parseFloat(match[1] + "." + match[4]);
    if (match[3]) {
      val = val * units.getMultiplier(match[3]);
    }
    unit = inferUnit(match[2], ref);
    if (!unit) return null;
    else return {
      val: val,
      unit: unit,
      extra: match[5],
    }
  }
  return null;
}

function valueCompare(a, b, stra, strb) {
  if (a === null && b === null) {
    // Failed to parse both values, compare them as strings.
    if (stra != strb) return stra > strb ? 1 : -1;
    else return 0;
  } else if (a === null) {
    return 1;
  } else if (b === null) {
    return -1;
  } else {
    if (a.unit != b.unit) return a.unit > b.unit ? 1 : -1;
    else if (a.val != b.val) return a.val > b.val ? 1 : -1;
    else if (a.extra != b.extra) return a.extra > b.extra ? 1 : -1;
    else return 0;
  }
}

function validateSaveImgDimension(element) {
  var valid = false;
  var intValue = 0;
  if (/^[1-9]\d*$/.test(element.value)) {
    intValue = parseInt(element.value);
    if (intValue <= 16000) {
      valid = true;
    }
  }
  if (valid) {
    element.classList.remove("invalid");
  } else {
    element.classList.add("invalid");
  }
  return intValue;
}

function saveImage(layer) {
  var width = validateSaveImgDimension(document.getElementById("render-save-width"));
  var height = validateSaveImgDimension(document.getElementById("render-save-height"));
  var bgcolor = null;
  if (!document.getElementById("render-save-transparent").checked) {
    var style = getComputedStyle(topmostdiv);
    bgcolor = style.getPropertyValue("background-color");
  }
  if (!width || !height) return;
  
  // Prepare image
  var canvas = document.createElement("canvas");
  var layerdict = {
    transform: {
      x: 0,
      y: 0,
      s: 1,
      panx: 0,
      pany: 0,
      zoom: 1,
    },
    bg: canvas,
    fab: canvas,
    silk: canvas,
    highlight: canvas,
    layer: layer,
  }
  // Do the rendering
  recalcLayerScale(layerdict, width, height);
  prepareLayer(layerdict);
  clearCanvas(canvas, bgcolor);
  drawBackground(layerdict, false);
  drawHighlightsOnLayer(layerdict, false);

  // Save image
  var imgdata = canvas.toDataURL("image/png");

  var filename = pcbdata.metadata.title;
  if (pcbdata.metadata.revision) {
    filename += `.${pcbdata.metadata.revision}`;
  }
  filename += `.${layer}.png`;
  saveFile(filename, dataURLtoBlob(imgdata));
}

function saveSettings() {
  var data = {
    type: "InteractiveHtmlBom settings",
    version: 1,
    pcbmetadata: pcbdata.metadata,
    settings: settings,
  }
  var blob = new Blob([JSON.stringify(data, null, 4)], {type: "application/json"});
  saveFile(`${pcbdata.metadata.title}.settings.json`, blob);
}

function loadSettings() {
  var input = document.createElement("input");
  input.type = "file";
  input.accept = ".settings.json";
  input.onchange = function(e) {
    var file = e.target.files[0];
    var reader = new FileReader();
    reader.onload = readerEvent => {
      var content = readerEvent.target.result;
      var newSettings;
      try {
        newSettings = JSON.parse(content);
      } catch(e) {
        alert("Selected file is not InteractiveHtmlBom settings file.");
        return;
      }
      if (newSettings.type != "InteractiveHtmlBom settings") {
        alert("Selected file is not InteractiveHtmlBom settings file.");
        return;
      }
      var metadataMatches = newSettings.hasOwnProperty("pcbmetadata");
      if (metadataMatches) {
        for (var k in pcbdata.metadata) {
          if (!newSettings.pcbmetadata.hasOwnProperty(k) || newSettings.pcbmetadata[k] != pcbdata.metadata[k]) {
            metadataMatches = false;
          }
        }
      }
      if (!metadataMatches) {
        var currentMetadata = JSON.stringify(pcbdata.metadata, null, 4);
        var fileMetadata = JSON.stringify(newSettings.pcbmetadata, null, 4);
        if (!confirm(
          `Settins file metadata does not match current metadata.\n\n` +
          `Page metadata:\n${currentMetadata}\n\n` +
          `Settings file metadata:\n${fileMetadata}\n\n` +
          `Press OK if you would like to import settings anyway.`)) {
          return;
        }
      }
      overwriteSettings(newSettings.settings);
    }
    reader.readAsText(file, 'UTF-8');
  }
  input.click();
}

function overwriteSettings(newSettings) {
  initDone = false;
  settings = newSettings;
  writeStorage("bomlayout", settings.bomlayout);
  writeStorage("canvaslayout", settings.canvaslayout);
  writeStorage("bomCheckboxes", settings.checkboxes.join(","));
  document.getElementById("bomCheckboxes").value = settings.checkboxes.join(",");
  for (var checkbox of settings.checkboxes) {
    writeStorage("checkbox_" + checkbox, settings.checkboxStoredRefs[checkbox]);
  }
  padsVisible(settings.renderPads);
  document.getElementById("padsCheckbox").checked = settings.renderPads;
  fabricationVisible(settings.renderFabrication);
  document.getElementById("fabricationCheckbox").checked = settings.renderFabrication;
  silkscreenVisible(settings.renderSilkscreen);
  document.getElementById("silkscreenCheckbox").checked = settings.renderSilkscreen;
  referencesVisible(settings.renderReferences);
  document.getElementById("referencesCheckbox").checked = settings.renderReferences;
  valuesVisible(settings.renderValues);
  document.getElementById("valuesCheckbox").checked = settings.renderValues;
  tracksVisible(settings.renderTracks);
  document.getElementById("tracksCheckbox").checked = settings.renderTracks;
  zonesVisible(settings.renderZones);
  document.getElementById("zonesCheckbox").checked = settings.renderZones;
  dnpOutline(settings.renderDnpOutline);
  document.getElementById("dnpOutlineCheckbox").checked = settings.renderDnpOutline;
  setRedrawOnDrag(settings.redrawOnDrag);
  document.getElementById("dragCheckbox").checked = settings.redrawOnDrag;
  setDarkMode(settings.darkMode);
  document.getElementById("darkmodeCheckbox").checked = settings.darkMode;
  setHighlightPin1(settings.highlightpin1);
  document.getElementById("highlightpin1Checkbox").checked = settings.highlightpin1;
  writeStorage("boardRotation", settings.boardRotation);
  document.getElementById("boardRotation").value = settings.boardRotation / 5;
  document.getElementById("rotationDegree").textContent = settings.boardRotation;
  initDone = true;
  prepCheckboxes();
  changeBomLayout(settings.bomlayout);
}

function saveFile(filename, blob) {
  var link = document.createElement("a");
  var objurl = URL.createObjectURL(blob);
  link.download = filename;
  link.href = objurl;
  link.click();
}

function dataURLtoBlob(dataurl) {
  var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
      bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
  while(n--){
      u8arr[n] = bstr.charCodeAt(n);
  }
  return new Blob([u8arr], {type:mime});
}

var settings = {
  canvaslayout: "default",
  bomlayout: "default",
  checkboxes: [],
  checkboxStoredRefs: {},
  darkMode: false,
  highlightpin1: false,
  redrawOnDrag: true,
  boardRotation: 0,
  renderPads: true,
  renderReferences: true,
  renderValues: true,
  renderSilkscreen: true,
  renderFabrication: true,
  renderDnpOutline: false,
  renderTracks: true,
  renderZones: true,
}

function initDefaults() {
  settings.bomlayout = readStorage("bomlayout");
  if (settings.bomlayout === null) {
    settings.bomlayout = config.bom_view;
  }
  if (!['bom-only', 'left-right', 'top-bottom'].includes(settings.bomlayout)) {
    settings.bomlayout = config.bom_view;
  }
  settings.canvaslayout = readStorage("canvaslayout");
  if (settings.canvaslayout === null) {
    settings.canvaslayout = config.layer_view;
  }
  var bomCheckboxes = readStorage("bomCheckboxes");
  if (bomCheckboxes === null) {
    bomCheckboxes = config.checkboxes;
  }
  settings.checkboxes = bomCheckboxes.split(",").filter((e) => e);
  document.getElementById("bomCheckboxes").value = bomCheckboxes;

  function initBooleanSetting(storageString, def, elementId, func) {
    var b = readStorage(storageString);
    if (b === null) {
      b = def;
    } else {
      b = (b == "true");
    }
    document.getElementById(elementId).checked = b;
    func(b);
  }

  initBooleanSetting("padsVisible", config.show_pads, "padsCheckbox", padsVisible);
  initBooleanSetting("fabricationVisible", config.show_fabrication, "fabricationCheckbox", fabricationVisible);
  initBooleanSetting("silkscreenVisible", config.show_silkscreen, "silkscreenCheckbox", silkscreenVisible);
  initBooleanSetting("referencesVisible", true, "referencesCheckbox", referencesVisible);
  initBooleanSetting("valuesVisible", true, "valuesCheckbox", valuesVisible);
  if ("tracks" in pcbdata) {
    initBooleanSetting("tracksVisible", true, "tracksCheckbox", tracksVisible);
    initBooleanSetting("zonesVisible", true, "zonesCheckbox", zonesVisible);
  } else {
    document.getElementById("tracksAndZonesCheckboxes").style.display = "none";
    tracksVisible(false);
    zonesVisible(false);
  }
  initBooleanSetting("dnpOutline", false, "dnpOutlineCheckbox", dnpOutline);
  initBooleanSetting("redrawOnDrag", config.redraw_on_drag, "dragCheckbox", setRedrawOnDrag);
  initBooleanSetting("darkmode", config.dark_mode, "darkmodeCheckbox", setDarkMode);
  initBooleanSetting("highlightpin1", config.highlight_pin1, "highlightpin1Checkbox", setHighlightPin1);
  settings.boardRotation = readStorage("boardRotation");
  if (settings.boardRotation === null) {
    settings.boardRotation = config.board_rotation * 5;
  } else {
    settings.boardRotation = parseInt(settings.boardRotation);
  }
  document.getElementById("boardRotation").value = settings.boardRotation / 5;
  document.getElementById("rotationDegree").textContent = settings.boardRotation;
}

///////////////////////////////////////////////

///////////////////////////////////////////////
/* PCB rendering code */

var emptyContext2d = document.createElement("canvas").getContext("2d");

function deg2rad(deg) {
  return deg * Math.PI / 180;
}

function calcFontPoint(linepoint, text, offsetx, offsety, tilt) {
  var point = [
    linepoint[0] * text.width + offsetx,
    linepoint[1] * text.height + offsety
  ];
  // Adding half a line height here is technically a bug
  // but pcbnew currently does the same, text is slightly shifted.
  point[0] -= (point[1] + text.height * 0.5) * tilt;
  return point;
}

function drawtext(ctx, text, color, flip) {
  if ("ref" in text && !settings.renderReferences) return;
  if ("val" in text && !settings.renderValues) return;
  ctx.save();
  ctx.fillStyle = color;
  ctx.strokeStyle = color;
  ctx.lineCap = "round";
  ctx.lineJoin = "round";
  ctx.lineWidth = text.thickness;
  if (text.svgpath) {
    ctx.stroke(new Path2D(text.svgpath));
    ctx.restore();
    return;
  }
  ctx.translate(...text.pos);
  var angle = -text.angle;
  if (text.attr.includes("mirrored")) {
    ctx.scale(-1, 1);
    angle = -angle;
  }
  var tilt = 0;
  if (text.attr.includes("italic")) {
    tilt = 0.125;
  }
  var interline = (text.height * 1.5 + text.thickness) / 2;
  var txt = text.text.split("\n");
  // KiCad ignores last empty line.
  if (txt[txt.length - 1] == '') txt.pop();
  ctx.rotate(deg2rad(angle));
  for (var i in txt) {
    var offsety = (-(txt.length - 1) + i * 2) * interline + text.height / 2;
    var lineWidth = 0;
    for (var c of txt[i]) {
      if (c == '\t') {
        var fourSpaces = 4 * pcbdata.font_data[' '].w * text.width;
        lineWidth += fourSpaces - lineWidth % fourSpaces;
      } else {
        lineWidth += pcbdata.font_data[c].w * text.width;
      }
    }
    var offsetx = 0;
    switch (text.horiz_justify) {
      case -1:
        // Justify left, do nothing
        break;
      case 0:
        // Justify center
        offsetx -= lineWidth / 2;
        break;
      case 1:
        // Justify right
        offsetx -= lineWidth;
        break;
    }
    for (var c of txt[i]) {
      if (c == '\t') {
        var fourSpaces = 4 * pcbdata.font_data[' '].w * text.width;
        offsetx += fourSpaces - offsetx % fourSpaces;
        continue;
      }
      for (var line of pcbdata.font_data[c].l) {
        ctx.beginPath();
        ctx.moveTo(...calcFontPoint(line[0], text, offsetx, offsety, tilt));
        for (var i = 1; i < line.length; i++) {
          ctx.lineTo(...calcFontPoint(line[i], text, offsetx, offsety, tilt));
        }
        ctx.stroke();
      }
      offsetx += pcbdata.font_data[c].w * text.width;
    }
  }
  ctx.restore();
}

function drawedge(ctx, scalefactor, edge, color) {
  ctx.strokeStyle = color;
  ctx.lineWidth = Math.max(1 / scalefactor, edge.width);
  ctx.lineCap = "round";
  if (edge.svgpath) {
    ctx.stroke(new Path2D(edge.svgpath));
  } else {
    ctx.beginPath();
    if (edge.type == "segment") {
      ctx.moveTo(...edge.start);
      ctx.lineTo(...edge.end);
    }
    if (edge.type == "arc") {
      ctx.arc(
        ...edge.start,
        edge.radius,
        deg2rad(edge.startangle),
        deg2rad(edge.endangle));
    }
    if (edge.type == "circle") {
      ctx.arc(
        ...edge.start,
        edge.radius,
        0, 2 * Math.PI);
      ctx.closePath();
    }
    if (edge.type == "curve") {
      ctx.moveTo(...edge.start);
      ctx.bezierCurveTo(...edge.cpa, ...edge.cpb, ...edge.end);
    }
    ctx.stroke();
  }
}

function getChamferedRectPath(size, radius, chamfpos, chamfratio) {
  // chamfpos is a bitmask, left = 1, right = 2, bottom left = 4, bottom right = 8
  var path = new Path2D();
  var width = size[0];
  var height = size[1];
  var x = width * -0.5;
  var y = height * -0.5;
  var chamfOffset = Math.min(width, height) * chamfratio;
  path.moveTo(x, 0);
  if (chamfpos & 4) {
    path.lineTo(x, y + height - chamfOffset);
    path.lineTo(x + chamfOffset, y + height);
    path.lineTo(0, y + height);
  } else {
    path.arcTo(x, y + height, x + width, y + height, radius);
  }
  if (chamfpos & 8) {
    path.lineTo(x + width - chamfOffset, y + height);
    path.lineTo(x + width, y + height - chamfOffset);
    path.lineTo(x + width, 0);
  } else {
    path.arcTo(x + width, y + height, x + width, y, radius);
  }
  if (chamfpos & 2) {
    path.lineTo(x + width, y + chamfOffset);
    path.lineTo(x + width - chamfOffset, y);
    path.lineTo(0, y);
  } else {
    path.arcTo(x + width, y, x, y, radius);
  }
  if (chamfpos & 1) {
    path.lineTo(x + chamfOffset, y);
    path.lineTo(x, y + chamfOffset);
    path.lineTo(x, 0);
  } else {
    path.arcTo(x, y, x, y + height, radius);
  }
  path.closePath();
  return path;
}

function getOblongPath(size) {
  return getChamferedRectPath(size, Math.min(size[0], size[1]) / 2, 0, 0);
}

function getPolygonsPath(shape) {
  if (shape.path2d) {
    return shape.path2d;
  }
  if (shape.svgpath) {
    shape.path2d = new Path2D(shape.svgpath);
  } else {
    var combinedPath = new Path2D();
    for (var polygon of shape.polygons) {
      var path = new Path2D();
      for (var vertex of polygon) {
        path.lineTo(...vertex)
      }
      path.closePath();
      combinedPath.addPath(path);
    }
    shape.path2d = combinedPath;
  }
  return shape.path2d;
}

function drawPolygonShape(ctx, shape, color) {
  ctx.save();
  ctx.fillStyle = color;
  if (!shape.svgpath) {
    ctx.translate(...shape.pos);
    ctx.rotate(deg2rad(-shape.angle));
  }
  ctx.fill(getPolygonsPath(shape));
  ctx.restore();
}

function drawDrawing(ctx, layer, scalefactor, drawing, color) {
  if (["segment", "arc", "circle"].includes(drawing.type)) {
    drawedge(ctx, scalefactor, drawing, color);
  } else if (drawing.type == "polygon") {
    drawPolygonShape(ctx, drawing, color);
  } else {
    drawtext(ctx, drawing, color, layer == "B");
  }
}

function getCirclePath(radius) {
  var path = new Path2D();
  path.arc(0, 0, radius, 0, 2 * Math.PI);
  path.closePath();
  return path;
}

function getCachedPadPath(pad) {
  if (!pad.path2d) {
    // if path2d is not set, build one and cache it on pad object
    if (pad.shape == "rect") {
      pad.path2d = new Path2D();
      pad.path2d.rect(...pad.size.map(c => -c * 0.5), ...pad.size);
    } else if (pad.shape == "oval") {
      pad.path2d = getOblongPath(pad.size);
    } else if (pad.shape == "circle") {
      pad.path2d = getCirclePath(pad.size[0] / 2);
    } else if (pad.shape == "roundrect") {
      pad.path2d = getChamferedRectPath(pad.size, pad.radius, 0, 0);
    } else if (pad.shape == "chamfrect") {
      pad.path2d = getChamferedRectPath(pad.size, pad.radius, pad.chamfpos, pad.chamfratio)
    } else if (pad.shape == "custom") {
      pad.path2d = getPolygonsPath(pad);
    }
  }
  return pad.path2d;
}

function drawPad(ctx, pad, color, outline, hole) {
  ctx.save();
  ctx.translate(...pad.pos);
  ctx.rotate(deg2rad(pad.angle));
  if (pad.offset) {
    ctx.translate(...pad.offset);
  }
  ctx.fillStyle = color;
  ctx.strokeStyle = color;
  var path = getCachedPadPath(pad);
  if (outline) {
    ctx.stroke(path);
  } else {
    ctx.fill(path);
  }
  if (pad.type == "th" && hole) {
    if (pad.offset) {
      ctx.translate(-pad.offset[0], -pad.offset[1]);
    }
    ctx.fillStyle = "#CCCCCC";
    if (pad.drillshape == "oblong") {
      ctx.fill(getOblongPath(pad.drillsize));
    } else {
      ctx.fill(getCirclePath(pad.drillsize[0] / 2));
    }
  }
  ctx.restore();
}

function drawModule(ctx, layer, scalefactor, module, padcolor, outlinecolor, highlight, outline) {
  if (highlight) {
    // draw bounding box
    if (module.layer == layer) {
      ctx.save();
      ctx.globalAlpha = 0.2;
      ctx.translate(...module.bbox.pos);
      ctx.rotate(deg2rad(-module.bbox.angle));
      ctx.translate(...module.bbox.relpos);
      ctx.fillStyle = padcolor;
      ctx.fillRect(0, 0, ...module.bbox.size);
      ctx.globalAlpha = 1;
      ctx.strokeStyle = padcolor;
      ctx.strokeRect(0, 0, ...module.bbox.size);
      ctx.restore();
    }
  }
  // draw drawings
  for (var drawing of module.drawings) {
    if (drawing.layer == layer) {
      drawDrawing(ctx, layer, scalefactor, drawing.drawing, padcolor);
    }
  }
  // draw pads
  if (settings.renderPads) {
    for (var pad of module.pads) {
      if (pad.layers.includes(layer)) {
        drawPad(ctx, pad, padcolor, outline, true);
        if (pad.pin1 && settings.highlightpin1) {
          drawPad(ctx, pad, outlinecolor, true, false);
        }
      }
    }
  }
}

function drawEdgeCuts(canvas, scalefactor) {
  var ctx = canvas.getContext("2d");
  var edgecolor = getComputedStyle(topmostdiv).getPropertyValue('--pcb-edge-color');
  for (var edge of pcbdata.edges) {
    drawedge(ctx, scalefactor, edge, edgecolor);
  }
}

function drawModules(canvas, layer, scalefactor, highlight) {
  var ctx = canvas.getContext("2d");
  ctx.lineWidth = 3 / scalefactor;
  var style = getComputedStyle(topmostdiv);
  var padcolor = style.getPropertyValue('--pad-color');
  var outlinecolor = style.getPropertyValue('--pin1-outline-color');
  if (highlight) {
    padcolor = style.getPropertyValue('--pad-color-highlight');
    outlinecolor = style.getPropertyValue('--pin1-outline-color-highlight');
  }
  for (var i = 0; i < pcbdata.modules.length; i++) {
    var mod = pcbdata.modules[i];
    var outline = settings.renderDnpOutline && pcbdata.bom.skipped.includes(i);
    if (!highlight || highlightedModules.includes(i)) {
      drawModule(ctx, layer, scalefactor, mod, padcolor, outlinecolor, highlight, outline);
    }
  }
}

function drawBgLayer(layername, canvas, layer, scalefactor, edgeColor, polygonColor, textColor) {
  var ctx = canvas.getContext("2d");
  for (var d of pcbdata[layername][layer]) {
    if (["segment", "arc", "circle"].includes(d.type)) {
      drawedge(ctx, scalefactor, d, edgeColor);
    } else if (d.type == "polygon") {
      drawPolygonShape(ctx, d, polygonColor);
    } else {
      drawtext(ctx, d, textColor, layer == "B");
    }
  }
}

function drawTracks(canvas, layer, color, highlight) {
  ctx = canvas.getContext("2d");
  ctx.strokeStyle = color;
  ctx.lineCap = "round";
  for(var track of pcbdata.tracks[layer]) {
    if (highlight && highlightedNet != track.net) continue;
    ctx.lineWidth = track.width;
    ctx.beginPath();
    ctx.moveTo(...track.start);
    ctx.lineTo(...track.end);
    ctx.stroke();
  }
}

function drawZones(canvas, layer, color, highlight) {
  ctx = canvas.getContext("2d");
  ctx.strokeStyle = color;
  ctx.fillStyle = color;
  ctx.lineJoin = "round";
  for(var zone of pcbdata.zones[layer]) {
    if (!zone.path2d) {
      zone.path2d = getPolygonsPath(zone);
    }
    if (highlight && highlightedNet != zone.net) continue;
    ctx.lineWidth = zone.width ? zone.width : 0;
    ctx.fill(zone.path2d);
    ctx.stroke(zone.path2d);
  }
}

function clearCanvas(canvas, color = null) {
  var ctx = canvas.getContext("2d");
  ctx.save();
  ctx.setTransform(1, 0, 0, 1, 0, 0);
  if (color) {
    ctx.fillStyle = color;
    ctx.fillRect(0, 0, canvas.width, canvas.height);
  } else {
    ctx.clearRect(0, 0, canvas.width, canvas.height);
  }
  ctx.restore();
}

function drawNets(canvas, layer, highlight) {
  var style = getComputedStyle(topmostdiv);
  if (settings.renderTracks) {
    var trackColor = style.getPropertyValue(highlight ? '--track-color-highlight' : '--track-color');
    drawTracks(canvas, layer, trackColor, highlight);
  }
  if (settings.renderZones) {
    var zoneColor = style.getPropertyValue(highlight ? '--zone-color-highlight' : '--zone-color');
    drawZones(canvas, layer, zoneColor, highlight);
  }
  if (highlight && settings.renderPads) {
    var padColor = style.getPropertyValue('--pad-color-highlight');
    var ctx = canvas.getContext("2d");
    for (var mod of pcbdata.modules) {
      // draw pads
      for (var pad of mod.pads) {
        if (highlightedNet != pad.net) continue;
        if (pad.layers.includes(layer)) {
          drawPad(ctx, pad, padColor, false, true);
        }
      }
    }
  }
}

function drawHighlightsOnLayer(canvasdict, clear = true) {
  if (clear) {
    clearCanvas(canvasdict.highlight);
  }
  if (highlightedModules.length > 0) {
    drawModules(canvasdict.highlight, canvasdict.layer,
      canvasdict.transform.s * canvasdict.transform.zoom, true);
  }    
  if (highlightedNet !== null) {
    drawNets(canvasdict.highlight, canvasdict.layer, true);
  }  
}  

function drawHighlights() {
  drawHighlightsOnLayer(allcanvas.front);
  drawHighlightsOnLayer(allcanvas.back);
}

function drawBackground(canvasdict, clear = true) {
  if (clear) {
    clearCanvas(canvasdict.bg);
    clearCanvas(canvasdict.fab);
    clearCanvas(canvasdict.silk);
  }

  drawNets(canvasdict.bg, canvasdict.layer, false);
  drawModules(canvasdict.bg, canvasdict.layer,
    canvasdict.transform.s * canvasdict.transform.zoom, false);

  drawEdgeCuts(canvasdict.bg, canvasdict.transform.s);

  var style = getComputedStyle(topmostdiv);
  var edgeColor = style.getPropertyValue('--silkscreen-edge-color');
  var polygonColor = style.getPropertyValue('--silkscreen-polygon-color');
  var textColor = style.getPropertyValue('--silkscreen-text-color');
  if (settings.renderSilkscreen) {
    drawBgLayer(
      "silkscreen", canvasdict.silk, canvasdict.layer,
      canvasdict.transform.s * canvasdict.transform.zoom,
      edgeColor, polygonColor, textColor);
  }
  edgeColor = style.getPropertyValue('--fabrication-edge-color');
  polygonColor = style.getPropertyValue('--fabrication-polygon-color');
  textColor = style.getPropertyValue('--fabrication-text-color');
  if (settings.renderFabrication) {
    drawBgLayer(
      "fabrication", canvasdict.fab, canvasdict.layer,
      canvasdict.transform.s * canvasdict.transform.zoom,
      edgeColor, polygonColor, textColor);
  }
}

function prepareCanvas(canvas, flip, transform) {
  var ctx = canvas.getContext("2d");
  ctx.setTransform(1, 0, 0, 1, 0, 0);
  var fontsize = 1.55;
  ctx.scale(transform.zoom, transform.zoom);
  ctx.translate(transform.panx, transform.pany);
  if (flip) {
    ctx.scale(-1, 1);
  }
  ctx.translate(transform.x, transform.y);
  ctx.rotate(deg2rad(settings.boardRotation));
  ctx.scale(transform.s, transform.s);
}

function prepareLayer(canvasdict) {
  var flip = (canvasdict.layer == "B");
  for (var c of ["bg", "fab", "silk", "highlight"]) {
    prepareCanvas(canvasdict[c], flip, canvasdict.transform);
  }
}

function rotateVector(v, angle) {
  angle = deg2rad(angle);
  return [
    v[0] * Math.cos(angle) - v[1] * Math.sin(angle),
    v[0] * Math.sin(angle) + v[1] * Math.cos(angle)
  ];
}

function applyRotation(bbox) {
  var corners = [
    [bbox.minx, bbox.miny],
    [bbox.minx, bbox.maxy],
    [bbox.maxx, bbox.miny],
    [bbox.maxx, bbox.maxy],
  ];
  corners = corners.map((v) => rotateVector(v, settings.boardRotation));
  return {
    minx: corners.reduce((a, v) => Math.min(a, v[0]), Infinity),
    miny: corners.reduce((a, v) => Math.min(a, v[1]), Infinity),
    maxx: corners.reduce((a, v) => Math.max(a, v[0]), -Infinity),
    maxy: corners.reduce((a, v) => Math.max(a, v[1]), -Infinity),
  }
}

function recalcLayerScale(layerdict, width, height) {
  var bbox = applyRotation(pcbdata.edges_bbox);
  var scalefactor = 0.98 * Math.min(
    width / (bbox.maxx - bbox.minx),
    height / (bbox.maxy - bbox.miny)
  );
  if (scalefactor < 0.1) {
    scalefactor = 1;
  }
  layerdict.transform.s = scalefactor;
  var flip = (layerdict.layer == "B");
  if (flip) {
    layerdict.transform.x = -((bbox.maxx + bbox.minx) * scalefactor + width) * 0.5;
  } else {
    layerdict.transform.x = -((bbox.maxx + bbox.minx) * scalefactor - width) * 0.5;
  }
  layerdict.transform.y = -((bbox.maxy + bbox.miny) * scalefactor - height) * 0.5;
  for (var c of ["bg", "fab", "silk", "highlight"]) {
    canvas = layerdict[c];
    canvas.width = width;
    canvas.height = height;
    canvas.style.width = (width / devicePixelRatio) + "px";
    canvas.style.height = (height / devicePixelRatio) + "px";
  }
}

function redrawCanvas(layerdict) {
  prepareLayer(layerdict);
  drawBackground(layerdict);
  drawHighlightsOnLayer(layerdict);
}

function resizeCanvas(layerdict) {
  var canvasdivid = {
    "F": "frontcanvas",
    "B": "backcanvas"
  } [layerdict.layer];
  var width = document.getElementById(canvasdivid).clientWidth * devicePixelRatio;
  var height = document.getElementById(canvasdivid).clientHeight * devicePixelRatio;
  recalcLayerScale(layerdict, width, height);
  redrawCanvas(layerdict);
}

function resizeAll() {
  resizeCanvas(allcanvas.front);
  resizeCanvas(allcanvas.back);
}

function pointWithinDistanceToSegment(x, y, x1, y1, x2, y2, d) {
  var A = x - x1;
  var B = y - y1;
  var C = x2 - x1;
  var D = y2 - y1;

  var dot = A * C + B * D;
  var len_sq = C * C + D * D;
  var dx, dy;
  if (len_sq == 0) {
    // start and end of the segment coincide
    dx = x - x1;
    dy = y - y1;
  } else {
    var param = dot / len_sq;
    var xx, yy;
    if (param < 0) {
      xx = x1;
      yy = y1;
    } else if (param > 1) {
      xx = x2;
      yy = y2;
    } else {
      xx = x1 + param * C;
      yy = y1 + param * D;
    }
    dx = x - xx;
    dy = y - yy;
  }
  return dx * dx + dy * dy <= d * d;
}

function pointWithinPad(x, y, pad) {
  var v = [x - pad.pos[0], y - pad.pos[1]];
  v = rotateVector(v, -pad.angle);
  if (pad.offset) {
    v[0] -= pad.offset[0];
    v[1] -= pad.offset[1];
  }
  return emptyContext2d.isPointInPath(getCachedPadPath(pad), ...v);
}

function netHitScan(layer, x, y) {
  // Check track segments
  if (settings.renderTracks && pcbdata.tracks) {
    for(var track of pcbdata.tracks[layer]) {
      if (pointWithinDistanceToSegment(x, y, ...track.start, ...track.end, track.width / 2)) {
        return track.net;
      }
    }
  }
  // Check pads
  if (settings.renderPads) {
    for (var mod of pcbdata.modules) {
      for(var pad of mod.pads) {
        if (pad.layers.includes(layer) && pointWithinPad(x, y, pad)) {
          return pad.net;
        }
      }
    }
  }
  return null;
}

function pointWithinModuleBbox(x, y, bbox) {
  var v = [x - bbox.pos[0], y - bbox.pos[1]];
  v = rotateVector(v, bbox.angle);
  return bbox.relpos[0] <= v[0] && v[0] <= bbox.relpos[0] + bbox.size[0] &&
         bbox.relpos[1] <= v[1] && v[1] <= bbox.relpos[1] + bbox.size[1];
}

function bboxHitScan(layer, x, y) {
  var result = [];
  for (var i = 0; i < pcbdata.modules.length; i++) {
    var module = pcbdata.modules[i];
    if (module.layer == layer) {
      if (pointWithinModuleBbox(x, y, module.bbox)) {
        result.push(i);
      }
    }
  }
  return result;
}

function handlePointerDown(e, layerdict) {
  if (e.button != 0) {
    return;
  }
  e.preventDefault();
  e.stopPropagation();

  if (!e.hasOwnProperty("offsetX")) {
    // The polyfill doesn't set this properly
    e.offsetX = e.pageX - e.currentTarget.offsetLeft;
    e.offsetY = e.pageY - e.currentTarget.offsetTop;
  }

  layerdict.pointerStates[e.pointerId] = {
    distanceTravelled: 0,
    lastX: e.offsetX,
    lastY: e.offsetY,
    downTime: Date.now(),
  };
}

function handleMouseClick(e, layerdict) {
  if (!e.hasOwnProperty("offsetX")) {
    // The polyfill doesn't set this properly
    e.offsetX = e.pageX - e.currentTarget.offsetLeft;
    e.offsetY = e.pageY - e.currentTarget.offsetTop;
  }

  var x = e.offsetX;
  var y = e.offsetY;
  var t = layerdict.transform;
  if (layerdict.layer == "B") {
    x = (devicePixelRatio * x / t.zoom - t.panx + t.x) / -t.s;
  } else {
    x = (devicePixelRatio * x / t.zoom - t.panx - t.x) / t.s;
  }
  y = (devicePixelRatio * y / t.zoom - t.y - t.pany) / t.s;
  var v = rotateVector([x, y], -settings.boardRotation);
  if ("nets" in pcbdata) {
    var net = netHitScan(layerdict.layer, ...v);
    if (net !== highlightedNet) {
      highlightedNet = net;
      clearHighlightedModules();
      drawHighlights();
    }
  }
  if (highlightedNet === null) {
    var modules = bboxHitScan(layerdict.layer, ...v);
    if (modules.length > 0) {
      modulesClicked(modules);
    }
  }
}

function handlePointerLeave(e, layerdict) {
  e.preventDefault();
  e.stopPropagation();

  if (!settings.redrawOnDrag) {
    redrawCanvas(layerdict);
  }

  delete layerdict.pointerStates[e.pointerId];
}

function resetTransform(layerdict) {
  layerdict.transform.panx = 0;
  layerdict.transform.pany = 0;
  layerdict.transform.zoom = 1;
  redrawCanvas(layerdict);
}

function handlePointerUp(e, layerdict) {
  if (!e.hasOwnProperty("offsetX")) {
    // The polyfill doesn't set this properly
    e.offsetX = e.pageX - e.currentTarget.offsetLeft;
    e.offsetY = e.pageY - e.currentTarget.offsetTop;
  }

  e.preventDefault();
  e.stopPropagation();

  if (e.button == 2) {
    // Reset pan and zoom on right click.
    resetTransform(layerdict);
    layerdict.anotherPointerTapped = false;
    return;
  }

  // We haven't necessarily had a pointermove event since the interaction started, so make sure we update this now
  var ptr = layerdict.pointerStates[e.pointerId];
  ptr.distanceTravelled += Math.abs(e.offsetX - ptr.lastX) + Math.abs(e.offsetY - ptr.lastY);

  if (e.button == 0 && ptr.distanceTravelled < 10 && Date.now() - ptr.downTime <= 500) {
    if (Object.keys(layerdict.pointerStates).length == 1) {
      if (layerdict.anotherPointerTapped) {
        // This is the second pointer coming off of a two-finger tap
        resetTransform(layerdict);
      } else {
        // This is just a regular tap
        handleMouseClick(e, layerdict);
      }
      layerdict.anotherPointerTapped = false;
    } else {
      // This is the first finger coming off of what could become a two-finger tap
      layerdict.anotherPointerTapped = true;
    }
  } else {
    if (!settings.redrawOnDrag) {
      redrawCanvas(layerdict);
    }
    layerdict.anotherPointerTapped = false;
  }

  delete layerdict.pointerStates[e.pointerId];
}

function handlePointerMove(e, layerdict) {
  if (!layerdict.pointerStates.hasOwnProperty(e.pointerId)) {
    return;
  }
  e.preventDefault();
  e.stopPropagation();

  if (!e.hasOwnProperty("offsetX")) {
    // The polyfill doesn't set this properly
    e.offsetX = e.pageX - e.currentTarget.offsetLeft;
    e.offsetY = e.pageY - e.currentTarget.offsetTop;
  }

  var thisPtr = layerdict.pointerStates[e.pointerId];

  var dx = e.offsetX - thisPtr.lastX;
  var dy = e.offsetY - thisPtr.lastY;

  // If this number is low on pointer up, we count the action as a click
  thisPtr.distanceTravelled += Math.abs(dx) + Math.abs(dy);

  if (Object.keys(layerdict.pointerStates).length == 1) {
    // This is a simple drag
    layerdict.transform.panx += devicePixelRatio * dx / layerdict.transform.zoom;
    layerdict.transform.pany += devicePixelRatio * dy / layerdict.transform.zoom;
  } else if (Object.keys(layerdict.pointerStates).length == 2) {
    var otherPtr = Object.values(layerdict.pointerStates).filter((ptr) => ptr != thisPtr)[0];

    var oldDist = Math.sqrt(Math.pow(thisPtr.lastX - otherPtr.lastX, 2) + Math.pow(thisPtr.lastY - otherPtr.lastY, 2));
    var newDist = Math.sqrt(Math.pow(e.offsetX - otherPtr.lastX, 2)     + Math.pow(e.offsetY - otherPtr.lastY, 2));

    var scaleFactor = newDist/oldDist;

    if (scaleFactor != NaN) {
      layerdict.transform.zoom *= scaleFactor;

      var zoomd = (1 - scaleFactor) / layerdict.transform.zoom;
      layerdict.transform.panx += devicePixelRatio * otherPtr.lastX * zoomd;
      layerdict.transform.pany += devicePixelRatio * otherPtr.lastY * zoomd;
    }
  }

  thisPtr.lastX = e.offsetX;
  thisPtr.lastY = e.offsetY;

  if (settings.redrawOnDrag) {
    redrawCanvas(layerdict);
  }
}

function handleMouseWheel(e, layerdict) {
  e.preventDefault();
  e.stopPropagation();
  var t = layerdict.transform;
  var wheeldelta = e.deltaY;
  if (e.deltaMode == 1) {
    // FF only, scroll by lines
    wheeldelta *= 30;
  } else if (e.deltaMode == 2) {
    wheeldelta *= 300;
  }
  var m = Math.pow(1.1, -wheeldelta / 40);
  // Limit amount of zoom per tick.
  if (m > 2) {
    m = 2;
  } else if (m < 0.5) {
    m = 0.5;
  }
  t.zoom *= m;
  var zoomd = (1 - m) / t.zoom;
  t.panx += devicePixelRatio * e.offsetX * zoomd;
  t.pany += devicePixelRatio * e.offsetY * zoomd;
  redrawCanvas(layerdict);
}

function addMouseHandlers(div, layerdict) {
  div.addEventListener("pointerdown", function(e) {
    handlePointerDown(e, layerdict);
  });
  div.addEventListener("pointermove", function(e) {
    handlePointerMove(e, layerdict);
  });
  div.addEventListener("pointerup", function(e) {
    handlePointerUp(e, layerdict);
  });
  var pointerleave = function(e) {
    handlePointerLeave(e, layerdict);
  }
  div.addEventListener("pointercancel", pointerleave);
  div.addEventListener("pointerleave", pointerleave);
  div.addEventListener("pointerout", pointerleave);

  div.onwheel = function(e) {
    handleMouseWheel(e, layerdict);
  }
  for (var element of [div, layerdict.bg, layerdict.fab, layerdict.silk, layerdict.highlight]) {
    element.addEventListener("contextmenu", function(e) {
      e.preventDefault();
    }, false);
  }
}

function setRedrawOnDrag(value) {
  settings.redrawOnDrag = value;
  writeStorage("redrawOnDrag", value);
}

function setBoardRotation(value) {
  settings.boardRotation = value * 5;
  writeStorage("boardRotation", settings.boardRotation);
  document.getElementById("rotationDegree").textContent = settings.boardRotation;
  resizeAll();
}

function initRender() {
  allcanvas = {
    front: {
      transform: {
        x: 0,
        y: 0,
        s: 1,
        panx: 0,
        pany: 0,
        zoom: 1,
      },
      pointerStates: {},
      anotherPointerTapped: false,
      bg: document.getElementById("F_bg"),
      fab: document.getElementById("F_fab"),
      silk: document.getElementById("F_slk"),
      highlight: document.getElementById("F_hl"),
      layer: "F",
    },
    back: {
      transform: {
        x: 0,
        y: 0,
        s: 1,
        panx: 0,
        pany: 0,
        zoom: 1,
      },
      pointerStates: {},
      anotherPointerTapped: false,
      bg: document.getElementById("B_bg"),
      fab: document.getElementById("B_fab"),
      silk: document.getElementById("B_slk"),
      highlight: document.getElementById("B_hl"),
      layer: "B",
    }
  };
  addMouseHandlers(document.getElementById("frontcanvas"), allcanvas.front);
  addMouseHandlers(document.getElementById("backcanvas"), allcanvas.back);
}

///////////////////////////////////////////////

///////////////////////////////////////////////
/* DOM manipulation and misc code */

var bomsplit;
var canvassplit;
var initDone = false;
var bomSortFunction = null;
var currentSortColumn = null;
var currentSortOrder = null;
var currentHighlightedRowId;
var highlightHandlers = [];
var moduleIndexToHandler = {};
var highlightedModules = [];
var highlightedNet = null;
var lastClicked;

function dbg(html) {
  dbgdiv.innerHTML = html;
}

function redrawIfInitDone() {
  if (initDone) {
    redrawCanvas(allcanvas.front);
    redrawCanvas(allcanvas.back);
  }
}

function padsVisible(value) {
  writeStorage("padsVisible", value);
  settings.renderPads = value;
  redrawIfInitDone();
}

function referencesVisible(value) {
  writeStorage("referencesVisible", value);
  settings.renderReferences = value;
  redrawIfInitDone();
}

function valuesVisible(value) {
  writeStorage("valuesVisible", value);
  settings.renderValues = value;
  redrawIfInitDone();
}

function tracksVisible(value) {
  writeStorage("tracksVisible", value);
  settings.renderTracks = value;
  redrawIfInitDone();
}

function zonesVisible(value) {
  writeStorage("zonesVisible", value);
  settings.renderZones = value;
  redrawIfInitDone();
}

function dnpOutline(value) {
  writeStorage("dnpOutline", value);
  settings.renderDnpOutline = value;
  redrawIfInitDone();
}

function setDarkMode(value) {
  if (value) {
    topmostdiv.classList.add("dark");
  } else {
    topmostdiv.classList.remove("dark");
  }
  writeStorage("darkmode", value);
  settings.darkMode = value;
  redrawIfInitDone();
}

function fabricationVisible(value) {
  writeStorage("fabricationVisible", value);
  settings.renderFabrication = value;
  redrawIfInitDone();
}

function silkscreenVisible(value) {
  writeStorage("silkscreenVisible", value);
  settings.renderSilkscreen = value;
  redrawIfInitDone();
}

function setHighlightPin1(value) {
  writeStorage("highlightpin1", value);
  settings.highlightpin1 = value;
  redrawIfInitDone();
}

function getStoredCheckboxRefs(checkbox) {
  function convert(ref) {
    var intref = parseInt(ref);
    if (isNaN(intref)) {
      for (var i = 0; i < pcbdata.modules.length; i++) {
        if (pcbdata.modules[i].ref == ref) {
          return i;
        }
      }
      return -1;
    } else {
      return intref;
    }
  }
  if (!(checkbox in settings.checkboxStoredRefs)) {
    settings.checkboxStoredRefs[checkbox] = readStorage("checkbox_" + checkbox);
  }
  if (!settings.checkboxStoredRefs[checkbox]) {
    return new Set();
  } else {
    return new Set(settings.checkboxStoredRefs[checkbox].split(",").map(r => convert(r)));
  }
}

function getCheckboxState(checkbox, references) {
  var storedRefsSet = getStoredCheckboxRefs(checkbox);
  var currentRefsSet = new Set(references.map(r => r[1]));
  // Get difference of current - stored
  var difference = new Set(currentRefsSet);
  for (ref of storedRefsSet) {
    difference.delete(ref);
  }
  if (difference.size == 0) {
    // All the current refs are stored
    return "checked";
  } else if (difference.size == currentRefsSet.size) {
    // None of the current refs are stored
    return "unchecked";
  } else {
    // Some of the refs are stored
    return "indeterminate";
  }
}

function setBomCheckboxState(checkbox, element, references) {
  var state = getCheckboxState(checkbox, references);
  element.checked = (state == "checked");
  element.indeterminate = (state == "indeterminate");
}

function createCheckboxChangeHandler(checkbox, references) {
  return function() {
    refsSet = getStoredCheckboxRefs(checkbox);
    if (this.checked) {
      // checkbox ticked
      for (var ref of references) {
        refsSet.add(ref[1]);
      }
    } else {
      // checkbox unticked
      for (var ref of references) {
        refsSet.delete(ref[1]);
      }
    }
    settings.checkboxStoredRefs[checkbox] = [...refsSet].join(",");
    writeStorage("checkbox_" + checkbox, settings.checkboxStoredRefs[checkbox]);
    updateCheckboxStats(checkbox);
  }
}

function clearHighlightedModules() {
  if (currentHighlightedRowId) {
    document.getElementById(currentHighlightedRowId).classList.remove("highlighted");
    currentHighlightedRowId = null;
    highlightedModules = [];
  }
}

function createRowHighlightHandler(rowid, refs) {
  return function() {
    if (currentHighlightedRowId) {
      if (currentHighlightedRowId == rowid) {
        return;
      }
      document.getElementById(currentHighlightedRowId).classList.remove("highlighted");
    }
    document.getElementById(rowid).classList.add("highlighted");
    currentHighlightedRowId = rowid;
    highlightedModules = refs.map(r => r[1]);
    drawHighlights();
  }
}

function entryMatches(entry) {
  // check refs
  for (var ref of entry[3]) {
    if (ref[0].toLowerCase().indexOf(filter) >= 0) {
      return true;
    }
  }
  // check extra fields
  for (var i in config.extra_fields) {
    if (entry[4][i].toLowerCase().indexOf(filter) >= 0) {
      return true;
    }
  }
  // check value
  if (entry[1].toLowerCase().indexOf(filter) >= 0) {
    return true;
  }
  // check footprint
  if (entry[2].toLowerCase().indexOf(filter) >= 0) {
    return true;
  }
  return false;
}

function findRefInEntry(entry) {
  return entry[3].filter(r => r[0].toLowerCase() == reflookup);
}

function highlightFilter(s) {
  if (!filter) {
    return s;
  }
  var parts = s.toLowerCase().split(filter);
  if (parts.length == 1) {
    return s;
  }
  var r = "";
  var pos = 0;
  for (var i in parts) {
    if (i > 0) {
      r += '<mark class="highlight">' +
        s.substring(pos, pos + filter.length) +
        '</mark>';
      pos += filter.length;
    }
    r += s.substring(pos, pos + parts[i].length);
    pos += parts[i].length;
  }
  return r;
}

function checkboxSetUnsetAllHandler(checkboxname) {
  return function() {
    var checkboxnum = 0;
    while (checkboxnum < settings.checkboxes.length &&
      settings.checkboxes[checkboxnum].toLowerCase() != checkboxname.toLowerCase()) {
      checkboxnum++;
    }
    if (checkboxnum >= settings.checkboxes.length) {
      return;
    }
    var allset = true;
    var checkbox;
    var row;
    for (row of bombody.childNodes) {
      checkbox = row.childNodes[checkboxnum + 1].childNodes[0];
      if (!checkbox.checked || checkbox.indeterminate) {
        allset = false;
        break;
      }
    }
    for (row of bombody.childNodes) {
      checkbox = row.childNodes[checkboxnum + 1].childNodes[0];
      checkbox.checked = !allset;
      checkbox.indeterminate = false;
      checkbox.onchange();
    }
  }
}

function createColumnHeader(name, cls, comparator) {
  var th = document.createElement("TH");
  th.innerHTML = name;
  th.classList.add(cls);
  th.style.cursor = "pointer";
  var span = document.createElement("SPAN");
  span.classList.add("sortmark");
  span.classList.add("none");
  th.appendChild(span);
  th.onclick = function() {
    if (currentSortColumn && this !== currentSortColumn) {
      // Currently sorted by another column
      currentSortColumn.childNodes[1].classList.remove(currentSortOrder);
      currentSortColumn.childNodes[1].classList.add("none");
      currentSortColumn = null;
      currentSortOrder = null;
    }
    if (currentSortColumn && this === currentSortColumn) {
      // Already sorted by this column
      if (currentSortOrder == "asc") {
        // Sort by this column, descending order
        bomSortFunction = function(a, b) {
          return -comparator(a, b);
        }
        currentSortColumn.childNodes[1].classList.remove("asc");
        currentSortColumn.childNodes[1].classList.add("desc");
        currentSortOrder = "desc";
      } else {
        // Unsort
        bomSortFunction = null;
        currentSortColumn.childNodes[1].classList.remove("desc");
        currentSortColumn.childNodes[1].classList.add("none");
        currentSortColumn = null;
        currentSortOrder = null;
      }
    } else {
      // Sort by this column, ascending order
      bomSortFunction = comparator;
      currentSortColumn = this;
      currentSortColumn.childNodes[1].classList.remove("none");
      currentSortColumn.childNodes[1].classList.add("asc");
      currentSortOrder = "asc";
    }
    populateBomBody();
  }
  return th;
}

function populateBomHeader() {
  while (bomhead.firstChild) {
    bomhead.removeChild(bomhead.firstChild);
  }
  var tr = document.createElement("TR");
  var th = document.createElement("TH");
  th.classList.add("numCol");
  tr.appendChild(th);
  var checkboxCompareClosure = function(checkbox) {
    return (a, b) => {
      var stateA = getCheckboxState(checkbox, a[3]);
      var stateB = getCheckboxState(checkbox, b[3]);
      if (stateA > stateB) return -1;
      if (stateA < stateB) return 1;
      return 0;
    }
  }
  for (var checkbox of settings.checkboxes) {
    th = createColumnHeader(
      checkbox, "bom-checkbox", checkboxCompareClosure(checkbox));
    th.onclick = fancyDblClickHandler(
      th, th.onclick.bind(th), checkboxSetUnsetAllHandler(checkbox));
    tr.appendChild(th);
  }
  tr.appendChild(createColumnHeader("References", "References", (a, b) => {
    var i = 0;
    while (i < a[3].length && i < b[3].length) {
      if (a[3][i] != b[3][i]) return a[3][i] > b[3][i] ? 1 : -1;
      i++;
    }
    return a[3].length - b[3].length;
  }));
  // Extra fields
  if (config.extra_fields.length > 0) {
    var extraFieldCompareClosure = function(fieldIndex) {
      return (a, b) => {
        var fa = a[4][fieldIndex];
        var fb = b[4][fieldIndex];
        if (fa != fb) return fa > fb ? 1 : -1;
        else return 0;
      }
    }
    for (var i in config.extra_fields) {
      tr.appendChild(createColumnHeader(
        config.extra_fields[i], "extra", extraFieldCompareClosure(i)));
    }
  }
  tr.appendChild(createColumnHeader("Value", "Value", (a, b) => {
    return valueCompare(a[5], b[5], a[1], b[1]);
  }));
  tr.appendChild(createColumnHeader("Footprint", "Footprint", (a, b) => {
    if (a[2] != b[2]) return a[2] > b[2] ? 1 : -1;
    else return 0;
  }));
  tr.appendChild(createColumnHeader("Quantity", "Quantity", (a, b) => {
    return a[3].length - b[3].length;
  }));
  bomhead.appendChild(tr);
}

function populateBomBody() {
  while (bom.firstChild) {
    bom.removeChild(bom.firstChild);
  }
  highlightHandlers = [];
  moduleIndexToHandler = {};
  currentHighlightedRowId = null;
  var first = true;
  switch (settings.canvaslayout) {
    case 'F':
      bomtable = pcbdata.bom.F;
      break;
    case 'FB':
      bomtable = pcbdata.bom.both;
      break;
    case 'B':
      bomtable = pcbdata.bom.B;
      break;
  }
  if (bomSortFunction) {
    bomtable = bomtable.slice().sort(bomSortFunction);
  }
  for (var i in bomtable) {
    var bomentry = bomtable[i];
    if (filter && !entryMatches(bomentry)) {
      continue;
    }
    var references = bomentry[3];
    if (reflookup) {
      references = findRefInEntry(bomentry);
      if (references.length == 0) {
        continue;
      }
    }
    var tr = document.createElement("TR");
    var td = document.createElement("TD");
    var rownum = +i + 1;
    tr.id = "bomrow" + rownum;
    td.textContent = rownum;
    tr.appendChild(td);
    // Checkboxes
    for (var checkbox of settings.checkboxes) {
      if (checkbox) {
        td = document.createElement("TD");
        var input = document.createElement("input");
        input.type = "checkbox";
        input.onchange = createCheckboxChangeHandler(checkbox, references);
        setBomCheckboxState(checkbox, input, references);
        td.appendChild(input);
        tr.appendChild(td);
      }
    }
    // References
    td = document.createElement("TD");
    td.innerHTML = highlightFilter(references.map(r => r[0]).join(", "));
    tr.appendChild(td);
    // Extra fields
    for (var i in config.extra_fields) {
      td = document.createElement("TD");
      td.innerHTML = highlightFilter(bomentry[4][i]);
      tr.appendChild(td);
    }
    // Value
    td = document.createElement("TD");
    td.innerHTML = highlightFilter(bomentry[1]);
    tr.appendChild(td);
    // Footprint
    td = document.createElement("TD");
    td.innerHTML = highlightFilter(bomentry[2]);
    tr.appendChild(td);
    // Quantity
    td = document.createElement("TD");
    td.textContent = bomentry[3].length;
    tr.appendChild(td);
    bom.appendChild(tr);
    var handler = createRowHighlightHandler(tr.id, references);
    tr.onmousemove = handler;
    highlightHandlers.push({
      id: tr.id,
      handler: handler,
      refs: references
    });
    for (var refIndex of references.map(r => r[1])) {
      moduleIndexToHandler[refIndex] = handler;
    }
    if ((filter || reflookup) && first) {
      handler();
      first = false;
    }
  }
}

function highlightPreviousRow() {
  if (!currentHighlightedRowId) {
    highlightHandlers[highlightHandlers.length - 1].handler();
  } else {
    if (highlightHandlers.length > 1 &&
      highlightHandlers[0].id == currentHighlightedRowId) {
      highlightHandlers[highlightHandlers.length - 1].handler();
    } else {
      for (var i = 0; i < highlightHandlers.length - 1; i++) {
        if (highlightHandlers[i + 1].id == currentHighlightedRowId) {
          highlightHandlers[i].handler();
          break;
        }
      }
    }
  }
  smoothScrollToRow(currentHighlightedRowId);
}

function highlightNextRow() {
  if (!currentHighlightedRowId) {
    highlightHandlers[0].handler();
  } else {
    if (highlightHandlers.length > 1 &&
      highlightHandlers[highlightHandlers.length - 1].id == currentHighlightedRowId) {
      highlightHandlers[0].handler();
    } else {
      for (var i = 1; i < highlightHandlers.length; i++) {
        if (highlightHandlers[i - 1].id == currentHighlightedRowId) {
          highlightHandlers[i].handler();
          break;
        }
      }
    }
  }
  smoothScrollToRow(currentHighlightedRowId);
}

function populateBomTable() {
  populateBomHeader();
  populateBomBody();
}

function modulesClicked(moduleIndexes) {
  var lastClickedIndex = moduleIndexes.indexOf(lastClicked);
  for (var i = 1; i <= moduleIndexes.length; i++) {
    var refIndex = moduleIndexes[(lastClickedIndex + i) % moduleIndexes.length];
    if (refIndex in moduleIndexToHandler) {
      lastClicked = refIndex;
      moduleIndexToHandler[refIndex]();
      smoothScrollToRow(currentHighlightedRowId);
      break;
    }
  }
}

function updateFilter(input) {
  filter = input.toLowerCase();
  populateBomTable();
}

function updateRefLookup(input) {
  reflookup = input.toLowerCase();
  populateBomTable();
}

function changeCanvasLayout(layout) {
  document.getElementById("fl-btn").classList.remove("depressed");
  document.getElementById("fb-btn").classList.remove("depressed");
  document.getElementById("bl-btn").classList.remove("depressed");
  switch (layout) {
    case 'F':
      document.getElementById("fl-btn").classList.add("depressed");
      if (settings.bomlayout != "bom-only") {
        canvassplit.collapse(1);
      }
      break;
    case 'B':
      document.getElementById("bl-btn").classList.add("depressed");
      if (settings.bomlayout != "bom-only") {
        canvassplit.collapse(0);
      }
      break;
    default:
      document.getElementById("fb-btn").classList.add("depressed");
      if (settings.bomlayout != "bom-only") {
        canvassplit.setSizes([50, 50]);
      }
  }
  settings.canvaslayout = layout;
  writeStorage("canvaslayout", layout);
  resizeAll();
  populateBomTable();
}

function populateMetadata() {
  document.getElementById("title").innerHTML = pcbdata.metadata.title;
  document.getElementById("revision").innerHTML = "Rev: " + pcbdata.metadata.revision;
  document.getElementById("company").innerHTML = pcbdata.metadata.company;
  document.getElementById("filedate").innerHTML = pcbdata.metadata.date;
  if (pcbdata.metadata.title != "") {
    document.title = pcbdata.metadata.title + " BOM";
  }
  var fp_f = 0, fp_b = 0, pads_f = 0, pads_b = 0, pads_th = 0;
  for (var i = 0; i < pcbdata.modules.length; i++) {
    if (pcbdata.bom.skipped.includes(i)) continue;
    var mod = pcbdata.modules[i];
    if (mod.layer == "F") {
      fp_f++;
    } else {
      fp_b++;
    }
    for (var pad of mod.pads) {
      if (pad.type == "th") {
        pads_th++;
      } else {
        if (pad.layers.includes("F")) {
          pads_f++;
        }
        if (pad.layers.includes("B")) {
          pads_b++;
        }
      }
    }
  }
  document.getElementById("stats-components-front").innerHTML = fp_f;
  document.getElementById("stats-components-back").innerHTML = fp_b;
  document.getElementById("stats-components-total").innerHTML = fp_f + fp_b;
  document.getElementById("stats-groups-front").innerHTML = pcbdata.bom.F.length;
  document.getElementById("stats-groups-back").innerHTML = pcbdata.bom.B.length;
  document.getElementById("stats-groups-total").innerHTML = pcbdata.bom.both.length;
  document.getElementById("stats-smd-pads-front").innerHTML = pads_f;
  document.getElementById("stats-smd-pads-back").innerHTML = pads_b;
  document.getElementById("stats-smd-pads-total").innerHTML = pads_f + pads_b;
  document.getElementById("stats-th-pads").innerHTML = pads_th;
}

function changeBomLayout(layout) {
  document.getElementById("bom-btn").classList.remove("depressed");
  document.getElementById("lr-btn").classList.remove("depressed");
  document.getElementById("tb-btn").classList.remove("depressed");
  switch (layout) {
    case 'bom-only':
      document.getElementById("bom-btn").classList.add("depressed");
      if (bomsplit) {
        bomsplit.destroy();
        bomsplit = null;
        canvassplit.destroy();
        canvassplit = null;
      }
      document.getElementById("frontcanvas").style.display = "none";
      document.getElementById("backcanvas").style.display = "none";
      document.getElementById("bot").style.height = "";
      break;
    case 'top-bottom':
      document.getElementById("tb-btn").classList.add("depressed");
      document.getElementById("frontcanvas").style.display = "";
      document.getElementById("backcanvas").style.display = "";
      document.getElementById("bot").style.height = "calc(100% - 80px)";
      document.getElementById("bomdiv").classList.remove("split-horizontal");
      document.getElementById("canvasdiv").classList.remove("split-horizontal");
      document.getElementById("frontcanvas").classList.add("split-horizontal");
      document.getElementById("backcanvas").classList.add("split-horizontal");
      if (bomsplit) {
        bomsplit.destroy();
        bomsplit = null;
        canvassplit.destroy();
        canvassplit = null;
      }
      bomsplit = Split(['#bomdiv', '#canvasdiv'], {
        sizes: [50, 50],
        onDragEnd: resizeAll,
        direction: "vertical",
        gutterSize: 5
      });
      canvassplit = Split(['#frontcanvas', '#backcanvas'], {
        sizes: [50, 50],
        gutterSize: 5,
        onDragEnd: resizeAll
      });
      break;
    case 'left-right':
      document.getElementById("lr-btn").classList.add("depressed");
      document.getElementById("frontcanvas").style.display = "";
      document.getElementById("backcanvas").style.display = "";
      document.getElementById("bot").style.height = "calc(100% - 80px)";
      document.getElementById("bomdiv").classList.add("split-horizontal");
      document.getElementById("canvasdiv").classList.add("split-horizontal");
      document.getElementById("frontcanvas").classList.remove("split-horizontal");
      document.getElementById("backcanvas").classList.remove("split-horizontal");
      if (bomsplit) {
        bomsplit.destroy();
        bomsplit = null;
        canvassplit.destroy();
        canvassplit = null;
      }
      bomsplit = Split(['#bomdiv', '#canvasdiv'], {
        sizes: [50, 50],
        onDragEnd: resizeAll,
        gutterSize: 5
      });
      canvassplit = Split(['#frontcanvas', '#backcanvas'], {
        sizes: [50, 50],
        gutterSize: 5,
        direction: "vertical",
        onDragEnd: resizeAll
      });
  }
  settings.bomlayout = layout;
  writeStorage("bomlayout", layout);
  changeCanvasLayout(settings.canvaslayout);
}

function focusFilterField() {
  focusInputField(document.getElementById("filter"));
}

function focusRefLookupField() {
  focusInputField(document.getElementById("reflookup"));
}

function toggleBomCheckbox(bomrowid, checkboxnum) {
  if (!bomrowid || checkboxnum > settings.checkboxes.length) {
    return;
  }
  var bomrow = document.getElementById(bomrowid);
  var checkbox = bomrow.childNodes[checkboxnum].childNodes[0];
  checkbox.checked = !checkbox.checked;
  checkbox.indeterminate = false;
  checkbox.onchange();
}

function checkBomCheckbox(bomrowid, checkboxname) {
  var checkboxnum = 0;
  while (checkboxnum < settings.checkboxes.length &&
    settings.checkboxes[checkboxnum].toLowerCase() != checkboxname.toLowerCase()) {
    checkboxnum++;
  }
  if (!bomrowid || checkboxnum >= settings.checkboxes.length) {
    return;
  }
  var bomrow = document.getElementById(bomrowid);
  var checkbox = bomrow.childNodes[checkboxnum + 1].childNodes[0];
  checkbox.checked = true;
  checkbox.indeterminate = false;
  checkbox.onchange();
}

function setBomCheckboxes(value) {
  writeStorage("bomCheckboxes", value);
  settings.checkboxes = value.split(",").filter((e) => e);
  prepCheckboxes();
  populateBomTable();
}

function prepCheckboxes() {
  var table = document.getElementById("checkbox-stats");
  while (table.childElementCount > 1) {
    table.removeChild(table.lastChild);
  }
  if (settings.checkboxes.length) {
    table.style.display = "";
  } else {
    table.style.display = "none";
  }
  for (var checkbox of settings.checkboxes) {
    var tr = document.createElement("TR");
    var td = document.createElement("TD");
    td.innerHTML = checkbox;
    tr.appendChild(td);
    td = document.createElement("TD");
    td.id = "checkbox-stats-" + checkbox;
    var progressbar = document.createElement("div");
    progressbar.classList.add("bar");
    td.appendChild(progressbar);
    var text = document.createElement("div");
    text.classList.add("text");
    td.appendChild(text);
    tr.appendChild(td);
    table.appendChild(tr);
    updateCheckboxStats(checkbox);
  }
}

function updateCheckboxStats(checkbox) {
  var checked = getStoredCheckboxRefs(checkbox).size;
  var total = pcbdata.modules.length - pcbdata.bom.skipped.length;
  var percent = checked * 100.0 / total;
  var td = document.getElementById("checkbox-stats-" + checkbox);
  td.firstChild.style.width = percent + "%";
  td.lastChild.innerHTML = checked + "/" + total + " (" + Math.round(percent) + "%)";
}

document.onkeydown = function(e) {
  switch (e.key) {
    case "n":
      if (document.activeElement.type == "text") {
        return;
      }
      if (currentHighlightedRowId !== null) {
        checkBomCheckbox(currentHighlightedRowId, "placed");
        highlightNextRow();
        e.preventDefault();
      }
      break;
    case "ArrowUp":
      highlightPreviousRow();
      e.preventDefault();
      break;
    case "ArrowDown":
      highlightNextRow();
      e.preventDefault();
      break;
    default:
      break;
  }
  if (e.altKey) {
    switch (e.key) {
      case "f":
        focusFilterField();
        e.preventDefault();
        break;
      case "r":
        focusRefLookupField();
        e.preventDefault();
        break;
      case "z":
        changeBomLayout("bom-only");
        e.preventDefault();
        break;
      case "x":
        changeBomLayout("left-right");
        e.preventDefault();
        break;
      case "c":
        changeBomLayout("top-bottom");
        e.preventDefault();
        break;
      case "v":
        changeCanvasLayout("F");
        e.preventDefault();
        break;
      case "b":
        changeCanvasLayout("FB");
        e.preventDefault();
        break;
      case "n":
        changeCanvasLayout("B");
        e.preventDefault();
        break;
      default:
        break;
    }
    if (e.key >= '1' && e.key <= '9') {
      toggleBomCheckbox(currentHighlightedRowId, parseInt(e.key));
    }
  }
}

window.onload = function(e) {
  initUtils();
  initRender();
  initStorage();
  initDefaults();
  cleanGutters();
  populateMetadata();
  dbgdiv = document.getElementById("dbg");
  bom = document.getElementById("bombody");
  bomhead = document.getElementById("bomhead");
  filter = "";
  reflookup = "";
  initDone = true;
  prepCheckboxes();
  // Triggers render
  changeBomLayout(settings.bomlayout);
}

window.onresize = resizeAll;
window.matchMedia("print").addListener(resizeAll);

///////////////////////////////////////////////

  </script>
</head>

<body>
<div id="topmostdiv" class="topmostdiv">
  <div id="top">
    <div style="float: right; height: 100%;">
      <div class="hideonprint menu" style="float: right; top: 8px;">
        <button class="menubtn"></button>
        <div class="menu-content">
          <label class="menu-label menu-label-top">
            <input id="darkmodeCheckbox" type="checkbox" onchange="setDarkMode(this.checked)">
            Dark mode
          </label>
          <label class="menu-label">
            <input id="padsCheckbox" type="checkbox" checked onchange="padsVisible(this.checked)">
            Show footprint pads
          </label>
          <label class="menu-label" style="width: calc(50% - 18px)">
            <input id="fabricationCheckbox" type="checkbox" checked onchange="fabricationVisible(this.checked)">
            Fab layer
          </label><!-- This comment eats space! All of it!
          --><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
            <input id="silkscreenCheckbox" type="checkbox" checked onchange="silkscreenVisible(this.checked)">
            Silkscreen
          </label>
          <label class="menu-label" style="width: calc(50% - 18px)">
            <input id="referencesCheckbox" type="checkbox" checked onchange="referencesVisible(this.checked)">
            References
          </label><!-- This comment eats space! All of it!
          --><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
            <input id="valuesCheckbox" type="checkbox" checked onchange="valuesVisible(this.checked)">
            Values
          </label>
          <div id="tracksAndZonesCheckboxes">
            <label class="menu-label" style="width: calc(50% - 18px)">
              <input id="tracksCheckbox" type="checkbox" checked onchange="tracksVisible(this.checked)">
              Tracks
            </label><!-- This comment eats space! All of it!
            --><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
              <input id="zonesCheckbox" type="checkbox" checked onchange="zonesVisible(this.checked)">
              Zones
            </label>
          </div>
          <label class="menu-label">
            <input id="dnpOutlineCheckbox" type="checkbox" checked onchange="dnpOutline(this.checked)">
            DNP components outlined
          </label>
          <label class="menu-label">
            <input id="highlightpin1Checkbox" type="checkbox" onchange="setHighlightPin1(this.checked)">
            Highlight first pin
          </label>
          <label class="menu-label">
            <input id="dragCheckbox" type="checkbox" checked onchange="setRedrawOnDrag(this.checked)">
            Continuous redraw on drag
          </label>
          <label class="menu-label">
            <span>Board rotation</span>
            <span style="float: right"><span id="rotationDegree">0</span>&#176;</span>
            <input id="boardRotation" type="range" min="-36" max="36" value="0" class="slider" oninput="setBoardRotation(this.value)">
          </label>
          <label class="menu-label">
            <div style="margin-left: 5px">Bom checkboxes</div>
            <input id="bomCheckboxes" class="menu-textbox" type=text
                   oninput="setBomCheckboxes(this.value)">
          </label>
          <label class="menu-label">
            <span class="shameless-plug">
              <span>Created using</span>
              <a target="blank" href="https://github.com/openscopeproject/InteractiveHtmlBom">InteractiveHtmlBom</a>
            </span>
          </label>
        </div>
      </div>
      <div class="button-container hideonprint"
           style="float: right; position: relative; top: 8px">
        <button id="fl-btn" class="left-most-button" onclick="changeCanvasLayout('F')"
                title="Front only">F
        </button>
        <button id="fb-btn" class="middle-button" onclick="changeCanvasLayout('FB')"
                title="Front and Back">FB
        </button>
        <button id="bl-btn" class="right-most-button" onclick="changeCanvasLayout('B')"
                title="Back only">B
        </button>
      </div>
      <div class="button-container hideonprint"
           style="float: right; position: relative; top: 8px">
        <button id="bom-btn" class="left-most-button" onclick="changeBomLayout('bom-only')"
                title="BOM only"></button>
        <button id="lr-btn" class="middle-button" onclick="changeBomLayout('left-right')"
                title="BOM left, drawings right"></button>
        <button id="tb-btn" class="right-most-button" onclick="changeBomLayout('top-bottom')"
                title="BOM top, drawings bot"></button>
      </div>
      <div class="hideonprint menu" style="float: right; top: 8px;">
        <button class="statsbtn"></button>
        <div class="menu-content">
          <table class="stats">
            <tbody>
              <tr>
                <td width="40%">Board stats</td>
                <td>Front</td>
                <td>Back</td>
                <td>Total</td>
              </tr>
              <tr>
                <td>Components</td>
                <td id="stats-components-front">~</td>
                <td id="stats-components-back">~</td>
                <td id="stats-components-total">~</td>
              </tr>
              <tr>
                <td>Groups</td>
                <td id="stats-groups-front">~</td>
                <td id="stats-groups-back">~</td>
                <td id="stats-groups-total">~</td>
              </tr>
              <tr>
                <td>SMD pads</td>
                <td id="stats-smd-pads-front">~</td>
                <td id="stats-smd-pads-back">~</td>
                <td id="stats-smd-pads-total">~</td>
              </tr>
              <tr>
                <td>TH pads</td>
                <td colspan=3 id="stats-th-pads">~</td>
              </tr>
            </tbody>
          </table>
          <table class="stats">
            <col width="40%"/><col />
            <tbody id="checkbox-stats">
              <tr>
                <td colspan=2 style="border-top: 0">Checkboxes</td>
              </tr>
            </tbody>
          </table>
        </div>
      </div>
      <div class="hideonprint menu" style="float: right; top: 8px;">
        <button class="iobtn"></button>
        <div class="menu-content">
          <div class="menu-label menu-label-top">
            <div style="margin-left: 5px;">Save board image</div>
            <div class="flexbox">
              <input id="render-save-width" class="menu-textbox" type="text" value="1000" placeholder="Width"
                  style="flex-grow: 1; width: 50px;" oninput="validateSaveImgDimension(this)">
              <span>X</span>
              <input id="render-save-height" class="menu-textbox" type="text" value="1000" placeholder="Height"
                  style="flex-grow: 1; width: 50px;" oninput="validateSaveImgDimension(this)">
            </div>
            <label>
              <input id="render-save-transparent" type="checkbox">
              Transparent background
            </label>
            <div class="flexbox">
              <button class="savebtn" onclick="saveImage('F')">Front</button>
              <button class="savebtn" onclick="saveImage('B')">Back</button>
            </div>
          </div>
          <div class="menu-label">
            <span style="margin-left: 5px;">Config and checkbox state</span>
            <div class="flexbox">
              <button class="savebtn" onclick="saveSettings()">Export</button>
              <button class="savebtn" onclick="loadSettings()">Import</button>
            </div>
          </div>
        </div>
      </div>
    </div>
    <div id="fileinfodiv" style="overflow: auto;">
      <table class="fileinfo">
        <tbody>
          <tr>
            <td id="title" class="title" style="width: 70%">
              Title
            </td>
            <td id="revision" class="title" style="width: 30%">
              Revision
            </td>
          </tr>
          <tr>
            <td id="company">
              Company
            </td>
            <td id="filedate">
              Date
            </td>
          </tr>
        </tbody>
      </table>
    </div>
  </div>
  <div id="bot" class="split" style="height: calc(100% - 80px)">
    <div id="bomdiv" class="split split-horizontal">
      <div style="width: 100%">
        <input id="reflookup" class="textbox searchbox reflookup hideonprint" type="text" placeholder="Ref lookup"
               oninput="updateRefLookup(this.value)">
        <input id="filter" class="textbox searchbox filter hideonprint" type="text" placeholder="Filter"
               oninput="updateFilter(this.value)">
        <div class="button-container hideonprint" style="float: left; margin: 0;">
          <button id="copy" title="Copy bom table to clipboard"
               onclick="copyToClipboard()"></button>
        </div>
      </div>
      <div id="dbg"></div>
      <table class="bom">
        <thead id="bomhead">
        </thead>
        <tbody id="bombody">
        </tbody>
      </table>
    </div>
    <div id="canvasdiv" class="split split-horizontal">
      <div id="frontcanvas" class="split" touch-action="none" style="overflow: hidden">
        <div style="position: relative; width: 100%; height: 100%;">
          <canvas id="F_bg" style="position: absolute; left: 0; top: 0; z-index: 0;"></canvas>
          <canvas id="F_fab" style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas>
          <canvas id="F_slk" style="position: absolute; left: 0; top: 0; z-index: 2;"></canvas>
          <canvas id="F_hl" style="position: absolute; left: 0; top: 0; z-index: 3;"></canvas>
        </div>
      </div>
      <div id="backcanvas" class="split" touch-action="none" style="overflow: hidden">
        <div style="position: relative; width: 100%; height: 100%;">
          <canvas id="B_bg" style="position: absolute; left: 0; top: 0; z-index: 0;"></canvas>
          <canvas id="B_fab" style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas>
          <canvas id="B_slk" style="position: absolute; left: 0; top: 0; z-index: 2;"></canvas>
          <canvas id="B_hl" style="position: absolute; left: 0; top: 0; z-index: 3;"></canvas>
        </div>
      </div>
    </div>
  </div>
</div>
</body>

</html>
